2012-02-13 155 views
1

我正在使用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

回答

7
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聲明實際上展現了一個更好,更簡單的計劃。

1
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