为什么“WHERE column = NULL”在SQL Server中抛出错误?

时间:2011-08-31 19:27:42

标签: sql sql-server sql-server-2005 sql-server-2008

  

可能重复:
  IS NULL vs = NULL in where clause + SQL Server

考虑以下代码 - 有人可以向我解释为什么一个查询不会抛出错误?我可以理解为什么它没有返回记录,但是它想要做什么?请记住,colA是一个int。它在2000,2005和2008 r2上的工作方式相同

create table #foo
( colA int )


insert into #foo
(colA)
values
(null)

select * from #foo --returns the one record we just created

select * from #foo where colA = null --does not throw an error and does not return a record! why??
select * from #foo where colA is null --returns the record

drop table #foo

此表中是否存在可返回colA = null的记录?

我目前没有任何其他数据库供我试用 - 这是标准还是特定于MSSQL的行为?

5 个答案:

答案 0 :(得分:5)

这是因为NULL不能等同于任何值。

禁用ANSI_NULLS选项,然后运行它,您将立即看到该行:

SET ANSI_NULLS OFF
select * from #foo --returns the one record we just created  
select * from #foo where colA = null --does not throw an error and does not return a record! why?? 
select * from #foo where colA is null --returns the record  drop table #foo 

答案 1 :(得分:4)

您可以使用SET ANSI_NULLS OFF;强制执行该行为,但由于这已被弃用并且使代码依赖于无法始终保证的SET设置,因此真正的解决方案是使用正确的语法(返回行。)

答案 2 :(得分:3)

它不会抛出错误,因为它不是无效的查询。问题是NULL表示没有数据,你不能拥有任何与之相等的东西。所以当你这样做时

select * from #foo where colA = null

它确实试图找到colA = null的行,但这是不可能的。因此没有错误也没有结果。

答案 3 :(得分:2)

NULL是RDBMS中的一个特殊值,表示未知或不适用的值。

所以永远不会有= NULL;此类比较无效,因此expr = NULL子句中WHERE的任何查询都不会返回任何行。

当然这有其怪癖,有些实现方式不同;例如:Oracle将空字符串('')视为NULL,并为此感到非常悲痛。

SQL Server具有ANSI NULL参数,使其符合SQL-92(例如,与NULL的比较,就像您所做的那样。

答案 4 :(得分:1)

我无法告诉你为什么以及为什么这个=运算符不支持空值但是在mysql中还有另一个运算符:“< =>” 仅适用于mysql。