【发布时间】:2022-03-24 08:32:21
【问题描述】:
这是关于我在 Microsoft Sql Server 中发现的一种奇怪行为。如果我错了,请纠正我。
SELECT COUNT(*) FROM TABLEA
WHERE [Column1] IS NULL;
这将返回 30018 行。
CREATE VIEW VIEWB AS
SELECT * FROM TABLEA AS t1
WHERE t1.[Column1] NOT IN ('Cross/Up sell', 'Renegotiation', 'Renewal')
如果我检查VIEWB,我在Column1 中找不到NULL:
SELECT COUNT(*) FROM VIEWB
WHERE [Column1] IS NULL;
这将返回 0 行。
为什么?上面的查询排除了 3 个值,但 不应排除 NULL。为什么 Sql Server 女士会这样?我应该预料到这一点吗? 我该如何解决?
【问题讨论】:
-
这是做什么的:SELECT COUNT(*) FROM TABLEA AS t1 WHERE t1.[Column1] NOT IN ('Cross/Up sell', 'Renegotiation', 'Renewal')
-
答案,正如 Martin Smith 和 Sumo 所指出的,它应该排除 NULL,因为
NULL不是一个值。 -
另一个 stackoverfellow 有一个与 NULL 有点相似的问题 stackoverflow.com/questions/11462716/weird-all-inwhere 解释关于 NULL 的规则非常令人困惑。我希望有人可以提及 ANSI SQL 对查询的 NULL 解释有哪些规则
-
@MichaelBuen - 我认为你的回答是错误的。如果列不可为空,则进行该转换仅在语义上等效。 SQL Server 不会像 OP 所期望的那样返回任何行。 (编辑刚刚注意到你在这些方面给出了第二个答案)
-
@MartinSmith 关于
NOT IN和IN的NULL,我已经知道它的规则了。这是关于ALL的规则让我绊倒,IIRC,ALL在内部翻译为MAX,因此关于MAX上的空值规则(空值被丢弃)也适用于ALL.. 或者我想.对 3 RDBMS 进一步测试,发现有区别,3 RDBMS 与MAX一致,但与ALL不一致
标签: sql sql-server sql-server-2008