作为CASE语句中的ELSE子句的值的范围
问题描述:
我有一个存储的proc,它应该基于一个整数来过滤结果,该整数可以是NULL
,我需要能够选择匹配整数或检索所有结果的结果但我无法弄清楚“全部”结果部分的语法。查询基本上是这样的:作为CASE语句中的ELSE子句的值的范围
Select * from dbo.TABLE
WHERE [IDField] =
CASE
WHEN ISNULL(@ID, 0) > 0 THEN @ID
ELSE ?????
END
我想用一个IN
范围,包括所有的值,因为它设置为0
或Null
将返回任何结果,但是这并不工作:
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
)
答
这个短语没有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
您的问题声明不是很清楚,但我想你要像'... WHERE [IDField] = @ID OR 1 = 1' 。 – mustaccio
在WHERE(和ON)子句中使用case _expressions_通常是一个糟糕的主意。代之以坚持和/或。 – jarlh