【发布时间】:2008-12-23 19:18:04
【问题描述】:
SQL Server 中是否有设置让 null = null 评估为 true?
【问题讨论】:
标签: sql-server
SQL Server 中是否有设置让 null = null 评估为 true?
【问题讨论】:
标签: sql-server
不是SQL Server的错,是NULL值引入了三元逻辑。 null=null 永远不会是真的,而且 null null 也不是真的。
你可以使用 ANSI_NULL OFF 但是:
“在 SQL Server 的未来版本中,ANSI_NULLS 将始终为 ON,任何显式将该选项设置为 OFF 的应用程序都会产生错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序功能。”
COALESCE 不会做你需要的吗?
【讨论】:
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)
编辑:好的,所以每个 cmets,我尝试了一些特定的 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 中删除。
哦,好吧。
【讨论】:
是的,一般来说,关闭它似乎不太好。
我只是提到了这一点,以防您进行比较时您的第一个对象在比较中可能不是空值:
val IS NULL 可用于测试某事物是否为空。
NULL = NULL 应该是 False,因为 Unknown = Unknown 是 Unknown 或 False。
【讨论】:
我将避免使用 ansi_nulls 设置并使用 isnull 函数,尽管它可能会使某些查询复杂化。
【讨论】:
我们可能在错误的抽象级别上处理这个问题。您似乎有一个查询,您以这样一种方式陈述了它,以至于您没有得到您期望的结果。因此,您问了一个关于如何更改数据库的问题,以便它会为您提供您所期望的,而不是数据库所理解的。
询问如何重述您的查询以便数据库按您的意图理解它不是更好吗?
然后你以它会使其他查询复杂化的断言结束。我认为我们中的很多人都对“哎哟”有一个普遍的反应。因为,鉴于您对 NULL 的明显理解,这可能是正确的。
如果您能告诉我们您认为会导致这些问题的原因是什么,我们或许可以帮助我们讨论您对 NULL 的理解。
【讨论】: