考虑以下代码 - 有人可以向我解释为什么一个查询不会抛出错误?我可以理解为什么它没有返回记录,但是它想要做什么?请记住,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的行为?
答案 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。