WHERE IS NULL、IS NOT NULL 或 NO WHERE 子句取决于 SQL Server 参数值
-
03-07-2019 - |
题
我在 SQL Server 2000 中有一个存储过程,它根据参数值执行搜索。对于传入的参数之一,我需要一个不同的 WHERE
子句取决于它的值 - 问题是这 3 个值将在哪里 MyColumn
IS NULL
IS NOT NULL
ANY VALUE (NULL AND NOT NULL)
(本质上没有WHERE
条款)
我在想出正确的语法时遇到了一些心理障碍。这是否可以在一个 select 语句中完成而不执行某些操作 IF @parameter BEGIN ... END
分枝?
解决方案
以下是使用单个 WHERE
子句解决此问题的方法:
WHERE (@myParm = value1 AND MyColumn IS NULL)
OR (@myParm = value2 AND MyColumn IS NOT NULL)
OR (@myParm = value3)
使用CASE语句无法使用,我的意思是:
SELECT Field1, Field2 FROM MyTable
WHERE CASE @myParam
WHEN value1 THEN MyColumn IS NULL
WHEN value2 THEN MyColumn IS NOT NULL
WHEN value3 THEN TRUE
END
可以使用案例陈述来解决这个问题,请参阅答案
其他提示
你可以这样做:
SELECT *
FROM foo
WHERE (@param = 0 AND MyColumn IS NULL)
OR (@param = 1 AND MyColumn IS NOT NULL)
OR (@param = 2)
类似的东西。
这是使用 CASE
:
DECLARE @myParam INT;
SET @myParam = 1;
SELECT *
FROM MyTable
WHERE 'T' = CASE @myParam
WHEN 1 THEN
CASE WHEN MyColumn IS NULL THEN 'T' END
WHEN 2 THEN
CASE WHEN MyColumn IS NOT NULL THEN 'T' END
WHEN 3 THEN 'T' END;
WHERE MyColumn = COALESCE(@value,MyColumn)
如果
@value
是NULL
, ,它将比较MyColumn
对自己,无视@value = no where
条款。如果
@value
有一个值(NOT NULL
)它将比较MyColumn
到@value
.
参考: 合并 (Transact-SQL).
CASE的另一种方式:
SELECT *
FROM MyTable
WHERE 1 = CASE WHEN @myParm = value1 AND MyColumn IS NULL THEN 1
WHEN @myParm = value2 AND MyColumn IS NOT NULL THEN 1
WHEN @myParm = value3 THEN 1
END
我在这个解决方案上取得了成功。它几乎像帕特里克一样,有点扭曲。您可以单独或按顺序使用这些表达式。如果参数为空,则将忽略该参数,并显示搜索列的所有值,包括NULLS。
SELECT * FROM MyTable
WHERE
--check to see if @param1 exists, if @param1 is blank, return all
--records excluding filters below
(Col1 LIKE '%' + @param1 + '%' OR @param1 = '')
AND
--where you want to search multiple columns using the same parameter
--enclose the first 'OR' expression in braces and enclose the entire
--expression
((Col2 LIKE '%' + @searchString + '%' OR Col3 LIKE '%' + @searchString + '%') OR @searchString = '')
AND
--if your search requires a date you could do the following
(Cast(DateCol AS DATE) BETWEEN CAST(@dateParam AS Date) AND CAST(GETDATE() AS DATE) OR @dateParam = '')
不隶属于 StackOverflow