微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 WHERE 子句从结果中删除空值?

如何解决为什么 WHERE 子句从结果中删除空值?

我有一个表格,我想从中过滤数据。我尝试了以下查询

SELECT 
SIS,COUNT(*)
FROM DL_SQ_DEV_INT.SMRY_DAILY_TRAILER_REPORT
GROUP BY 1;

Result:
BL,17386
EQ,3242
FIFO,5747
GR,15655
HOLD,13035
LT BL,20566
LT GR,14615
LT OR,14190
LT PU,13877
LT YE,13683
null,223376
OR,15727
PI,3563
PU,16105
RW,200
TA,6
tbd,25302
WH,1945
YE,14510

现在,当我在其中添加 WHERE 子句时,它会过滤掉空值。查询一个不等于 ()。我怎样才能避免这种情况并且在我的结果中仍然有空值?将 null 更改为空白或空格?

SELECT 
SIS,COUNT(*)
FROM DL_SQ_DEV_INT.SMRY_DAILY_TRAILER_REPORT
WHERE UPPER(TRIM(SIS)) <> 'EQ'
GROUP BY 1;

Result:
BL,17386
FIFO,13683
OR,14510

解决方法

你应该使用这个:

SELECT 
    SIS,COUNT(*)
FROM DL_SQ_DEV_INT.SMRY_DAILY_TRAILER_REPORT
WHERE TRIM(SIS) IS NULL OR UPPER(TRIM(SIS)) <> 'EQ'
GROUP BY 1;

为什么你的 WHERE 子句从结果中删除了空值:NULL 值意味着没有值或值是未知的,所以你不能使用标量值运算符比较 NULL 值,<> 'EQ' 将返回未知或不是真的。

你可以在sof中参考更多关于sql中NULL值的帖子,例如this link或在gg中搜索

,

“不等于”和“等于”都不会选择 NULL 值。

SQL 使用“三向逻辑”,其中表达式可以是 truefalseunknown。 NULL 是根本没有任何值,所以它不能等于某物,如果它不能等于比较值,它也不能“不等于”,而是未知。

要克服这个问题,您需要在 where 子句中明确处理 NULL,要包含 NULL,请使用 OR SIS IS NULL

SELECT 
SIS,COUNT(*)
FROM DL_SQ_DEV_INT.SMRY_DAILY_TRAILER_REPORT
WHERE UPPER(TRIM(SIS)) <> 'EQ' OR SIS IS NULL
GROUP BY 1;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。