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的记录。您应该看看这篇关于这种查询类型的文章。