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

Jon*_*Lam 4 sql teradata teradatasql

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

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
Run Code Online (Sandbox Code Playgroud)

现在,当我在其中添加 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
Run Code Online (Sandbox Code Playgroud)

Use*_*ady 5

“不等于”和“等于”都不会选择 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;
Run Code Online (Sandbox Code Playgroud)