在where子句中,IS NULL与= NULL有何区别? + SQL Server

20

如何检查一个值是否为 NULL [或者] = @param(其中@param为null)

示例:

Select column1 from Table1
where column2 IS NULL => works fine

如果我想用@param替换比较值(IS NULL),应该怎么做?

Select column1 from Table1
where column2 = @param => this works fine until @param got some value in it and if is null never finds a record.

这个怎么实现?

5个回答

42
select column1 from Table1
  where (@param is null and column2 is null)
     or (column2 = @param)

6

我知道这是一个老问题,但我也有同样的问题,并想到了另一个(更短的)答案。注意:这可能仅适用于支持ISNULL(expr,replacement)的MS SQL Server。

SELECT column1 FROM table1
WHERE ISNULL(column2,'') = ISNULL(@param,'')

这还假设您以相同的方式处理NULL和空字符串。

1
如果您将SQL更改为使用COALESCE而不是ISNULL,则它将适用于更多的数据库,因为前者是ISO/ANSI定义的,而后者不是。 - Scott Gartner

2
没有“一刀切”的查询方法,如何进行查询有微妙的性能影响。如果你想要不仅仅让查询返回正确的答案,而且还要考虑速度问题,可以参考Erland Sommarskog的文章《T-SQL中的动态搜索条件》(链接见这里)。
这里是关于x = @x OR @x IS NULL部分的链接。

1
WHERE ((COLUMN1 = @PARAM) OR (COLUMN1 IS NULL AND @PARAM IS NULL))

1
如果 @PARAM 为 null,那么 COLUMN = @PARAM 将永远不会成立,因此第二个条件 (@PARAM IS NOT NULL) 是多余的。 - Damien_The_Unbeliever
@Damien_The_Unbeliever Jun,你说得对,我已经删除了冗余代码。谢谢。 - Diego Mendes

0
Select column1 from Table1
where (column2 IS NULL and @param IS NULL) 
or ( column2 IS NOT NULL AND @param IS NOT NULL AND ( column2 = @param )  )

1
“column2 IS NOT NULL”检查是不必要的,因为这已经被“column2 = @param”所覆盖...这使得这个答案比去年被接受的答案更加简洁。 - Michael Fredrickson
去年的答案是这样的:(@param 为 null 并且 column2 为 null) 或者 (column2 = @param) 如果 @param 不为 null,则第一个条件将为 false,只有第二个条件将被评估:(column2 = @param) 我发现如果你正在检查像(column2 = @param)这样的东西,并且它可能是 null,则额外的检查更加安全。 - Mike A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接