为什么这个SQL语句会返回0
?
SELECT CASE WHEN NULL IN (9,1,NULL) THEN 1 ELSE 0 END
答案 0 :(得分:3)
SQL基于three-valued logic,其中有三个真值:TRUE
,FALSE
和UNKNOWN
。特殊的NULL
值是“缺失数据”的占位符,如果您比较某些内容,任何内容,缺少数据,结果都是未知的。
例如,<missing data>
是否等于<missing data>
?这是不可能的,所以结果是UNKNOWN
。
在这种特殊情况下,您试图找出<missing data>
是否在给定列表中:由于数据丢失,因此无法知道它是否在列表中,并且查询返回{{1} }。
0
答案 1 :(得分:2)
我不知道你正在使用什么RDBMS,因为他们中的一些人已经对如何处理NULL
进行了配置。
NULL IN (9, 1, NULL)
可以写成
(NULL = 9) OR (NULL = 1) OR (NULL = NULL)
而不是TRUE
和FALSE
。它们都是NULL
。由于CASE
语句中只有两个路径,因此它位于ELSE
块下。
答案 2 :(得分:0)
这取决于特定服务器中NULL
的处理方式。
例如,在SQL SERVER中,您可以设置ANSI_NULLS并让它返回1:
SET ANSI_NULLS OFF
SELECT CASE WHEN NULL IN (9,1,NULL) THEN 1 ELSE 0 END
有关详细信息,请阅读SET ANSI_NULLS
答案 3 :(得分:0)
因为您无法使用比较运算符比较null
值。您只能使用is null
或is not null
或使用COALESCE()
,ISNULL()
等功能。例如
SELECT CASE WHEN COALESCE(NULL,-1) IN (9,1,-1) THEN 1 ELSE 0 END
答案 4 :(得分:0)
空均值未定义。
NUll对象不等于其他NULL
NULL == 1返回false
NUll == 2 return false
NULL == NULL也返回false