为什么这个 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 nulloris 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