【问题标题】:HIVE WHERE NOT EXISTS doesn't compare NULLSHIVE WHERE NOT EXISTS 不比较 NULLS
【发布时间】:2017-08-30 20:34:08
【问题描述】:

我试图只选择某些列值不同的行。我的问题是,如果我使用 =,它不会将列与空值进行比较,如果我将 = 替换为 Like,我会收到以下错误,有什么建议吗?两个表都有相同的列

不支持的子查询表达式子查询表达式同时引用父查询表达式和子查询表达式,并且不是有效的连接条件。 (状态=42000,代码=10249)

SELECT * 
FROM table1 t
where not exists(
select * from table2 l where t.loco_id=l.loco_id and
t.a=l.a and
t.b=l.b
);

【问题讨论】:

  • (1) 添加包含所需结果的数据样本(2) 哪一列可能为 NULL?一种?乙? loco_id?他们都是?其中一些?

标签: sql hive hql hiveql


【解决方案1】:
select  t.* 

from                table1 t

        left join   table2 l 

        on          t.loco_id   <=> l.loco_id 
                and t.a         <=> l.a 
                and t.b         <=> l.b

where   l.loco_id is null
;

A B
对于非空值,使用 EQUAL(=) 运算符返回相同的结果 操作数,但如果两者都为 NULL,则返回 TRUE,如果其中之一返回 FALSE 一片空白。 (从 0.9.0 版开始。)

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-RelationalOperators

【讨论】:

    【解决方案2】:

    null 在技术上意味着它的unknown

    = 不比较 unknown-s;因为不可能比较它们...两个unknowns比较的结果是unknown

    select assert_true( (null = null) is null  )
    

    然而:

    select assert_true( (null = null) )
    

    会失败,因为结果是unknown(null)。

    如果您仍想使用null-s 加入;我建议添加一些coalesce-s 以摆脱这些unknown-s。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-19
      • 2013-04-17
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 2015-06-05
      相关资源
      最近更新 更多