Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2012与空比较_Sql Server_Sql Server 2012_Null_Comparison - Fatal编程技术网

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