Sql server SQL Server 2012与空比较
有人能解释为什么这两个语句返回不同的结果吗Sql server SQL Server 2012与空比较,sql-server,sql-server-2012,null,comparison,Sql Server,Sql Server 2012,Null,Comparison,有人能解释为什么这两个语句返回不同的结果吗 SELECT CASE WHEN NOT((NULL = NULL) OR (1 != 1)) THEN 1 ELSE 0 END SELECT CASE WHEN NOT((NULL = NULL) AND (1 != 1)) THEN 1 ELSE 0 END 我知道NULL与任何给定值相比都是false,我想使用该属性,但我停止了类似于上面的命令。我的实语句而不是空语句使用的变量可以是NULL,但我简化了它们以显示问题所在。我以为它和操作命令有
SELECT CASE WHEN NOT((NULL = NULL) OR (1 != 1)) THEN 1 ELSE 0 END
SELECT CASE WHEN NOT((NULL = NULL) AND (1 != 1)) THEN 1 ELSE 0 END
我知道NULL
与任何给定值相比都是false,我想使用该属性,但我停止了类似于上面的命令。我的实语句而不是空语句使用的变量可以是NULL
,但我简化了它们以显示问题所在。我以为它和操作命令有关,但似乎不是这样
我知道空与任何东西相比都是假的
这是不正确的,NULL
与任何计算结果相比都是未知的,而不是错误的,一个简单的例子:
SELECT CASE WHEN (NULL = NULL) THEN 'True'
WHEN NOT(NULL = NULL) THEN 'False'
ELSE 'Other'
END
将提供第三个选项Other
如果我们重写您的逻辑(仍然是相同的意思,但它变得更清楚):
我知道空与任何东西相比都是假的
这是不正确的,NULL
与任何计算结果相比都是未知的,而不是错误的,一个简单的例子:
SELECT CASE WHEN (NULL = NULL) THEN 'True'
WHEN NOT(NULL = NULL) THEN 'False'
ELSE 'Other'
END
将提供第三个选项Other
如果我们重写您的逻辑(仍然是相同的意思,但它变得更清楚):
因此,有两个选项:要么打开(而且应该打开)ANSI_NULLS,要么关闭ANSI_NULLS 在第一种情况下,任何与NULL的比较都会返回NULL(即使是像您这样的NULL值之间的比较) 在第二种情况下,sql server将评估空值之间的比较(例如,NULL=NULL将返回true)
因此,在考虑查询中的不同结果之前,必须首先考虑将NULL与任何东西进行比较,不将其评估为FALSE,但NULL
< P>,因此,有2种选择:要么您有ANNSILL NULLL(您应该),要么您有ANNSULNULL关闭。-- first query
SELECT CASE WHEN NOT((NULL = NULL) AND (1 != 1)) THEN 1 ELSE 0 END
=
SELECT CASE WHEN NOT(unknown AND false) THEN 1 ELSE 0 END
=
SELECT CASE WHEN NOT(false) THEN 1 ELSE 0 END
=
SELECT CASE WHEN true THEN 1 ELSE 0 END
=
1
-- second query
SELECT CASE WHEN NOT((NULL = NULL) OR (1 != 1)) THEN 1 ELSE 0 END
=
SELECT CASE WHEN NOT(unknown OR false) THEN 1 ELSE 0 END
=
SELECT CASE WHEN NOT(unknown) THEN 1 ELSE 0 END
=
SELECT CASE WHEN unknown THEN 1 ELSE 0 END
=
else matched, so 0
在第一种情况下,任何与NULL的比较都会返回NULL(即使是像您这样的NULL值之间的比较)
在第二种情况下,sql server将评估空值之间的比较(例如,NULL=NULL将返回true)
因此,在考虑查询中的不同结果之前,必须首先考虑将NULL与任何对象进行比较,不将其计算为FALSE,而NULL
-- first query
SELECT CASE WHEN NOT((NULL = NULL) AND (1 != 1)) THEN 1 ELSE 0 END
=
SELECT CASE WHEN NOT(unknown AND false) THEN 1 ELSE 0 END
=
SELECT CASE WHEN NOT(false) THEN 1 ELSE 0 END
=
SELECT CASE WHEN true THEN 1 ELSE 0 END
=
1
-- second query
SELECT CASE WHEN NOT((NULL = NULL) OR (1 != 1)) THEN 1 ELSE 0 END
=
SELECT CASE WHEN NOT(unknown OR false) THEN 1 ELSE 0 END
=
SELECT CASE WHEN NOT(unknown) THEN 1 ELSE 0 END
=
SELECT CASE WHEN unknown THEN 1 ELSE 0 END
=
else matched, so 0
对于D0dger在评论中提出的问题:
更有趣的是,为什么选择CASE WHEN(NULL=NULL)或(1!=1)然后选择1 ELSE 0 END,而选择CASE WHEN NOT((NULL=NULL)或(1!=1))然后选择1 ELSE 0 END返回0
,
对于D0dger在评论中提出的问题:
更有趣的是,为什么选择CASE WHEN(NULL=NULL)或(1!=1)然后选择1 ELSE 0 END,而选择CASE WHEN NOT((NULL=NULL)或(1!=1))然后选择1 ELSE 0 END返回0
,更有趣的是,为什么
选择CASE WHEN(NULL=NULL)或(1!=1)然后选择1 ELSE 0 END
和选择CASE WHEN NOT((NULL=NULL)或(1!=1))然后选择1 ELSE 0 END
返回0@D0dger,下面回答,更有趣的是为什么选择CASE WHEN(NULL=NULL)或(1!=1)然后1 ELSE 0 END
和在不((NULL=NULL)或(1!=1))时选择CASE,然后1 ELSE 0 END
返回0@D0dger,回答如下:“所以在第一个例子中,当[Unknown]和[True]为假时,但在第二个例子中,当[Unknown]或[True]为真时,则返回1。”如果这是正确的,那么简单的'NOT()'将改变这两个结果,而'和'语句则不会发生这种情况。似乎[Unknown]和[True]是[Unknown]…有点奇怪…或者可能不是…[Unknown]可以同时是真的和假的,所以“结果也将是[Unknown],因为它需要两个[True]才能是[True],”或者“结果需要一个[True]才能是[True]。我想就是这样。感谢你指出[Unknown],你说“所以在第一个例子中,当[Unknown]和[True]为false,但在第二个例子中,当[Unknown]或[True]为True时,返回1。”如果这是正确的,那么简单的'NOT()'将改变这两个结果,而'AND'语句不会发生这种情况。似乎[Unknown]和[True]是[Unknown]…有点奇怪…或者可能不是…[Unknown]可以同时是真的和假的,所以“结果也将是[Unknown],因为它需要两个[True]才能是[True],”或者“结果需要一个[True]才能是[True]。我想就是这样。感谢您指出[未知]
SELECT CASE WHEN (NULL = NULL) OR (1 != 1) THEN 1 ELSE 0 END
=
SELECT CASE WHEN unknown OR false THEN 1 ELSE 0 END
=
SELECT CASE WHEN unknown THEN 1 ELSE 0 END
=
else matched, so 0