为什么这个 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
oris not null
或使用 , 之类COALESCE()
的功能ISNULL()
。例如
SELECT CASE WHEN COALESCE(NULL,-1) IN (9,1,-1) THEN 1 ELSE 0 END
Null 表示未定义。
NULL 对象不等于其他 NULL
NULL==1 返回假
NULL==2 返回假
NULL==NULL 也返回 false