SQL Server GROUP BY NULL

问题描述:

我正在使用SQL Server,我必须按几列进行分组,但前提是设置为true。SQL Server GROUP BY NULL

DECLARE @setting tinyint 
SET @setting = 0 

SELECT col1 FROM table1 
GROUP BY col1, 
    CASE WHEN @setting = 1 THEN col2 ELSE NULL END 

,或者我应该默认为COL1,我总是通过,如果设置被设置使用组,这样的代码将是

CASE WHEN @test = 1 THEN col2 ELSE col1 END 

它实际工作使用NULL,但我可以在互联网上找到一个例子来证明它是正确的用法。

+2

fwiw,你的第一个代码块对我来说很合适,而且我已经多次使用这个模式。 – 2012-02-13 06:37:27

+0

从逻辑上说,你的group by可以只是'GROUP BY col1,col2',因为如果'@ setting'为'0',那么在col1上比较相等的所有值都可以按任意顺序返回 - 其中一个有效订单将会像'col2'命令一样。 – 2012-02-13 09:35:49

SELECT col1 FROM table1 
GROUP BY col1, 
    CASE WHEN @setting = 1 THEN col2 ELSE NULL END 

您的用法是正确的。你已经知道它的工作原理。
ELSE NULL是隐含在CASE,所以你可以写它作为

GROUP BY col1, CASE WHEN @setting = 1 THEN col2 END

你可以尝试是腼腆与变种像

GROUP BY col1, @setting * col2- 用于数字COL2
GROUP BY col1, COALESCE(NULLIF(@setting,1), col2)

但CASE声明实际上展现了一个更好,更简单的计划。

DECLARE @setting tinyint 
SET @setting = 0 

SELECT col1 FROM table1 
GROUP BY col1, 
    CASE WHEN @setting = 1 THEN col2 ELSE NULL END 

你的第一个例子应该工作。
如需进一步说明,是否需要group by col1, col2group by col1@setting = 1

编辑:你的第一个例子是正确的。

+0

当设置= 1时,我想按col1,col2分组,当设置= 0时,我只想按col1分组。 – user724981 2012-02-13 07:03:45