SQL中<> false条件无法匹配NULL值导致计数异常问题
问题原因
SQL采用三值逻辑运算体系,所有常规比较运算符(=、<>、>、<等)和NULL做运算时,返回结果既不是TRUE也不是FALSE,而是特殊值UNKNOWN。CASE WHEN语法只会在条件表达式返回明确为TRUE时才会进入THEN分支,返回FALSE和UNKNOWN的场景都会被跳过。你写的delivered_in_estimated_time_window <> false条件,在字段值为NULL时计算结果为UNKNOWN,因此不会命中计数逻辑,这就是NULL场景没被统计的根本原因。
修正方案
你可以根据使用的SQL引擎支持情况,选择两种写法:
- 通用兼容写法(所有支持布尔类型的SQL引擎都可用):显式补充NULL判断,覆盖需要的统计场景
count(case when recipient_status = 'Premium' and (delivered_in_estimated_time_window <> false OR delivered_in_estimated_time_window IS NULL) then 1 end)
- 标准SQL简洁写法:使用布尔值专属判断谓词
IS NOT FALSE,该谓词会将NULL判定为满足条件,仅当值明确为false时返回不匹配,完全匹配你的计数规则
count(case when recipient_status = 'Premium' and delivered_in_estimated_time_window IS NOT FALSE then 1 end)
补充说明:不要用
= NULL或者<> NULL来判断空值,这两种写法永远返回UNKNOWN,判断空值必须使用IS NULL/IS NOT NULL,或者对应布尔类型的IS [NOT] TRUE/FALSE谓词。
内容的提问来源于stack exchange,提问作者Ludwig
相关产品推荐
相关产品推荐

