在 HiveQL 的“on”子句中使用 case 语句进行条件连接

Posted

技术标签:

【中文标题】在 HiveQL 的“on”子句中使用 case 语句进行条件连接【英文标题】:Conditional join using case statement in 'on' clause in HiveQL 【发布时间】:2017-05-25 17:29:02 【问题描述】:

假设:要加入的 tbl_A 列中的值具有不同的长度:5 和 10。 要加入的tbl_B列中的值较大,加入substr()时应根据tble_A中值的长度应用。 因此,在使用 HiveQL 加入表时,我试图在“ON”子句中应用 case 语句,但出现以下错误:

编译语句时出错:FAILED: SemanticException [Error 10017]: Line 22:3 在 JOIN '11' 中遇到左右别名

这是我的代码:

select  
a.fullname, b.birthdate
from mydb.tbl_A a
left join mydb.tbl_B b
on a.fullname = 
   case when length(a.fullname) = 5 then substr(b.othername,1,5)
   when length(a.fullname)= 9 then substr(b.othername, 8, 9) end
and a.birthdate = b.birthdate

我找不到太多关于此的信息。您的帮助将不胜感激。谢谢你。

【问题讨论】:

【参考方案1】:

JOIN 目前有一些限制。 这是一个解决方法。

select  a.fullname
       ,b.birthdate

from                tbl_A a

        left join   tbl_B b

        on          a.fullname  = 
                    substr(b.othername,1,5)

                and a.birthdate = 
                    b.birthdate

where   length(a.fullname) <> 9
     or a.fullname is null

union all

select  a.fullname
       ,b.birthdate

from                tbl_A a

        left join   tbl_B b

        on          a.fullname  = 
                    substr(b.othername,8,9)

                and a.birthdate = 
                    b.birthdate

where   length(a.fullname) = 9

【讨论】:

以上是关于在 HiveQL 的“on”子句中使用 case 语句进行条件连接的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何规则可以在条件/案例表达式中使用sql语句子句的哪一部分?

在 where 子句中使用 CASE

HiveQL编译基础

SQL 在 WHERE IN 子句中使用 CASE 语句

Oracle:在 Where 子句中使用 Case 语句

在 Where 子句中使用 case 构建动态查询