2

我有一个要从中过滤数据的表。我尝试了以下查询

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,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
4

2 回答 2

2

你应该使用这个:

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 值的帖子,例如此链接或在 gg 中搜索

于 2021-07-09T02:01:13.383 回答
2

“不等于”和“等于”都不会选择 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;
于 2021-07-09T02:02:14.940 回答