Sql server 在WHERE中使用NULL

Sql server 在WHERE中使用NULL,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我的存储过程采用如下可选参数: CREATE PROCEDURE MyProc ( @P1 varchar(255) = NULL ) AS SELECT * FROM MyTable WHERE MyField = @P1 当@P1为NULL时,我想选择所有记录。一个明显的方法是在这里使用IF,但我想在一条SQL语句中使用它。有人能提出一个聪明的方法来实现这一点吗?我正在考虑使用ISNULL()或MyField=MyField。我也尝试过几种方法,但是NUL

我的存储过程采用如下可选参数:

CREATE PROCEDURE MyProc
(       
     @P1 varchar(255) = NULL
)
AS
     SELECT * FROM MyTable WHERE MyField = @P1
@P1
NULL
时,我想选择所有记录。一个明显的方法是在这里使用
IF
,但我想在一条SQL语句中使用它。有人能提出一个聪明的方法来实现这一点吗?我正在考虑使用
ISNULL()
MyField=MyField
。我也尝试过几种方法,但是
NULL=NULL
不是
True
这一事实是这里的主要障碍。

一种方法:

SELECT * FROM MyTable WHERE @P1 IS NULL OR MyField = @P1
另一种可能更有效的方法是使用
If…Else

if(@P1 IS NULL)
        begin
             SELECT * FROM MyTable
        End
Else
        begin
             SELECT * FROM MyTable WHERE MyField = @P1
        End

其中MyField=ISNULL(@P1,MyField)


这应该能满足您的需要。

其他答案为您提供了直接的解决方案,但您需要解决以下问题:

不能将相等(
=
)和不等(
)运算符与
NULL
一起使用,因为SQL将
NULL
视为一个不等于任何值的不同值(甚至其本身–
NULL=NULL
为false!)


而是使用
值为null
值不为null
分别检查null或not null。

@dotNET:if
@P1
有值
@P1为null
返回
false
,并且将为每行检查
MyField=@P1
。否则将返回所有行,因为
@P1为NULL
已返回
true
@dotNET-您是否至少执行了查询。了解
操作员的工作原理顺便说一句,我是第一个给出正确答案的人,问题的作者会问这不会失败…如果你是提问者,你如何知道它是否失败?最重要的是,作者问谁对答案投了赞成票????来吧,伙计们,这家伙每天都会抽出时间来帮助你,这就是你的回应。抱歉。@john-aggreeed。。。看到他的评论我很生气。像这样的人应该被解雇。第一种方法是我的建议。否则,您很可能会得到错误的缓存执行计划。这是显而易见的,但它失败了,因为问题中提到的
NULL=NULL
在SQL中不是真的。@dotNET不会失败。此代码中没有NULL=NULL比较。@SeanRange:如果
MyField
在特定行中为NULL,并且
@P1
也为NULL,该怎么办?这不是我编写代码的方式,但如果列不可为NULL,它会起作用。:)<代码>其中ISNULL(MyField,1)=ISNULL(@P1,MyField)??虽然很难看。并且它将省略MyField为null的记录。您应该看看这篇关于这种查询类型的文章。