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

Why does WHERE clause removes null values from the result?

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

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 更改为空白或 space?

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

Result:
BL,17386
FIFO,5747
GR,15655
HOLD,13035
LT BL,20566
LT GR,14615
LT OR,14190
LT PU,13877
LT YE,13683
OR,15727
PI,3563
PU,16105
RW,200
TA,6
tbd,25302
WH,1945
YE,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' 将 return 未知或不正确。

您可以参考更多 post 关于 sof sql 中的 NULL 值,例如 this link 或在 gg

中搜索

“不等于”和“等于”都不会 select 为 NULL 值。

SQL 使用“三向逻辑”,其中表达式可以是 truefalse未知。 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;