SQL Server中是否有设置将null = null计算为true?
答案 0 :(得分:9)
这不是SQL Server的错,它是由NULL值引入的三元逻辑引起的。 null = null永远不会为true,null<> null也不是真的。
你可以使用ANSI_NULL OFF但是:
“在SQL Server的未来版本中,ANSI_NULLS将始终为ON,并且将选项明确设置为OFF的任何应用程序都将生成错误。请避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序特征“。
COALESCE不会做你需要的吗?
答案 1 :(得分:3)
SET ANSI_NULLS OFF
将创建以下比较结果:
10 = NULL False
NULL = NULL True
10 <> NULL True
NULL <> NULL False
使用以下设置,这是默认设置:
SET ANSI_NULLS ON
相同的比较将给出这些结果:
10 = NULL NULL (Unknown)
NULL = NULL NULL (Unknown)
10 <> NULL NULL (Unknown)
NULL <> NULL NULL (Unknown)
编辑:好的,所以根据评论,我尝试了一些特定的SQL来验证声明这不起作用,这就是我发现的:
SET ANSI_NULLS OFF
CREATE TABLE TestTable (USERNAME VARCHAR(20))
INSERT INTO TestTable VALUES (NULL)
SELECT * FROM TestTable WHERE USERNAME = USERNAME
SELECT * FROM TestTable WHERE USERNAME = NULL
生成此输出:
[USERNAME]
(0 row(s) affected)
[USERNAME]
NULL
(1 row(s) affected)
所以我猜这个设置有缺陷。我只在一个特定的报告查询中看到并使用过这个设置,所以我不知道查询计划的差异使它在一个实例中工作而在另一个实例中不工作。
然后没有可行的设置。
即使它确实有效,但根据其他答案,依赖此设置是一个坏主意,因为它将在未来的版本中从SQL Server中拉出来。
哦,好吧。
答案 2 :(得分:1)
是的,关闭它一般看起来不太好。
我刚刚提到这个,以防你进行比较时第一个对象在比较中可能不是null:
val IS NULL可用于测试某些内容是否为空。
NULL = NULL应为False,因为Unknown = Unknown为Unknown或False。
答案 3 :(得分:0)
我会避免使用ansi_nulls设置并使用isnull函数,尽管它可能会使某些查询复杂化。
答案 4 :(得分:0)
我们可能在错误的抽象层面处理这个问题。看来你有一个查询,你已经以这样一种方式陈述它,你没有得到你期望的结果。所以你问了一个关于如何更改数据库的问题,这样它就能满足你的期望,而不是数据库理解的内容。
询问如何重述查询以便数据库按照您的意图理解它不是更好吗?
然后你断言它会使其他查询复杂化。我认为我们很多人都读过“哎哟”。因为,鉴于你对NULL的明显理解,这可能是真的。
如果您能告诉我们您认为会导致这些问题的原因,我们或许可以帮助我们讨论您对NULL的理解。