Rus*_*Cam 31 sql sql-server sql-server-2000
我在SQL Server 2000中有一个存储过程,它基于参数值执行搜索.对于传入的其中一个参数,我需要一个不同的WHERE
子句,具体取决于它的值 - 问题是3个值将在哪里MyColumn
IS NULL
IS NOT NULL
ANY VALUE (NULL AND NOT NULL)
(基本上没有WHERE
条款)我在提出正确的语法方面遇到了一些心理障碍.这可以在一个选择语句中执行而不执行某些IF @parameter BEGIN ... END
分支吗?
Pat*_*ald 41
以下是使用单个WHERE
子句解决此问题的方法:
WHERE (@myParm = value1 AND MyColumn IS NULL)
OR (@myParm = value2 AND MyColumn IS NOT NULL)
OR (@myParm = value3)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
可以使用case语句来解决这个问题,请参阅onedaywhen的回答
Bob*_*toe 13
你可以这样做:
SELECT *
FROM foo
WHERE (@param = 0 AND MyColumn IS NULL)
OR (@param = 1 AND MyColumn IS NOT NULL)
OR (@param = 2)
Run Code Online (Sandbox Code Playgroud)
这样的事情.
Cha*_*ant 10
WHERE MyColumn = COALESCE(@value,MyColumn)
Run Code Online (Sandbox Code Playgroud)
如果@value
是NULL
,它将MyColumn
与自身进行比较,忽略
@value = no where
条款.
如果@value
有一个值(NOT NULL
),它会比较MyColumn
来
@value
.
one*_*hen 10
这是使用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;
Run Code Online (Sandbox Code Playgroud)
小智 5
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
Run Code Online (Sandbox Code Playgroud)