2017-09-27 88 views
0

我有一個存儲的proc,它應該基於一個整數來過濾結果,該整數可以是NULL,我需要能夠選擇匹配整數或檢索所有結果的結果但我無法弄清楚「全部」結果部分的語法。查詢基本上是這樣的:作爲CASE語句中的ELSE子句的值的範圍

Select * from dbo.TABLE 
WHERE [IDField] = 
    CASE 
    WHEN ISNULL(@ID, 0) > 0 THEN @ID 
    ELSE ????? 
    END 

我想用一個IN範圍,包括所有的值,因爲它設置爲0Null將返回任何結果,但是這並不工作:

Select * from dbo.TABLE 
WHERE [IDField] = 
    CASE 
    WHEN ISNULL(@ID, 0) > 0 THEN @ID 
    ELSE 1 OR 2 OR 3 
    END 

或本:

Select * from dbo.TABLE 
WHERE [IDField] IN (
    CASE 
    WHEN ISNULL(@mID, 0) > 0 THEN @mID 
    ELSE 1,2,3 
    END 
) 
+0

您的問題聲明不是很清楚,但我想你要像'... WHERE [IDField] = @ID OR 1 = 1' 。 – mustaccio

+1

在WHERE(和ON)子句中使用case _expressions_通常是一個糟糕的主意。代之以堅持和/或。 – jarlh

回答

2

這個短語沒有case

SELECT * 
FROM dbo.TABLE 
WHERE @id is null OR IDField = @id; 

然後你就可以擴展爲:

SELECT * 
FROM dbo.TABLE 
WHERE (COALESCE(@ID, 0) > 0 AND IDField = @id) OR 
     IDField IN (1, 2, 3) 
+0

'Coalesce'不起作用,但剩下的部分是現貨。我以(@ID = 0 AND [IDField] in(1,2,3))或[IDfield] = @ID'結束了這個過程,因爲我的空值在過程的其他地方被設置爲0。謝謝。 – Wompguinea