WHERE是NULL,IS NOT NULL或NO WHERE子句取决于SQL Server参数值

Rus*_*Cam 31 sql sql-server sql-server-2000

我在SQL Server 2000中有一个存储过程,它基于参数值执行搜索.对于传入的其中一个参数,我需要一个不同的WHERE子句,具体取决于它的值 - 问题是3个值将在哪里MyColumn

  1. IS NULL
  2. IS NOT NULL
  3. 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的回答

  • 我不确定你是否*需要*括号,但我是复杂布尔表达式中括号的主要支持者.如果你问我的话,没有它们会让编译器完成操作顺序并且相当可怕. (2认同)

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)
  • 如果@valueNULL,它将MyColumn与自身进行比较,忽略 @value = no where条款.

  • 如果@value有一个值(NOT NULL),它会比较MyColumn@value.

参考: COALESCE(Transact-SQL).


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)