为什么这个SQL语句返回0
?
SELECT CASE WHEN NULL IN (9,1,NULL) THEN 1 ELSE 0 END
SQL 基于三值逻辑,其中有三个真值:TRUE
、FALSE
和 UNKNOWN
。特殊NULL
值是"缺失数据"的占位符,如果将某些内容与缺失数据进行比较,则结果是未知的。
例如,<missing data>
等于<missing data>
吗?不可能知道,所以结果是UNKNOWN
.
在这种特殊情况下,您正在尝试找出<missing data>
是否在给定列表中:由于数据丢失,因此无法知道它是否在列表中,并且查询返回0
。
SELECT CASE WHEN NULL IN (9,1,NULL) THEN 1 ELSE 0 END
你正在使用什么RDBMS,因为其中一些配置了如何处理NULL
。
NULL IN (9, 1, NULL)
可以写成
(NULL = 9) OR (NULL = 1) OR (NULL = NULL)
他们中没有TRUE
也没有FALSE
.他们都是NULL
.由于 CASE
语句中只有两条路径,因此它属于ELSE
块。
在特定服务器中如何处理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
的备注部分
因为您无法使用比较运算符比较null
值。您只能使用is null
或is not null
或使用COALESCE()
、ISNULL()
等函数。例如
SELECT CASE WHEN COALESCE(NULL,-1) IN (9,1,-1) THEN 1 ELSE 0 END
Null 表示未定义。
空对象不等于其他空
空 ==1 返回假
空==2 返回假
空==空返回也为假