2017-09-27 39 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