【问题标题】:Why does WHERE clause removes null values from the result?为什么 WHERE 子句从结果中删除空值?
【发布时间】:2021-09-19 10:23:50
【问题描述】:

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

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

【问题讨论】:

  • 1代表什么,可以添加你的表架构吗?
  • Group by 1 与 Group by SIS 相同。我将添加架构

标签: sql teradata teradatasql


【解决方案1】:

“不等于”和“等于”都不会选择 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;

【讨论】:

    【解决方案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 值,&lt;&gt; 'EQ' 将返回未知或不正确.

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

    【讨论】:

    • 我通常使用 COALESCE()
    • @JeffDege 你的意思是使用COALESCE(TRIM(sis), ' ') = ' ' 而不是TRIM(sis) IS NULL?这只是另一种代码风格,都将返回正确的结果。
    • WHERE COALESCE(UPPER(TRIM(SIS)),'x') &lt;&gt; 'EQ' 将替换整行,代码更少,但可以说不太容易一目了然地理解代码的意图
    • COALESCE(field, '') '' 只是第一次看到很难理解。这是一个常见的成语。
    • @JeffDege:优化器将无法使用收集到的关于 COALESCE 的统计信息,从而导致(可能完全)错误估计和没有信心。像这样的简单查询没有问题,但可能对于包含很多步骤的复杂查询。
    猜你喜欢
    • 1970-01-01
    • 2017-10-31
    • 2016-11-27
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多