Hive中cawhen不支持子查询的解决方法

更新时间:2023-05-11 20:50:18 阅读: 评论:0

Hive中cawhen不⽀持⼦查询的解决⽅法
在mysql等关系型数据库中,ca when 函数在条件判断中是我们经常使⽤的函数。同样的hive中也有这个函数。但是由于hive不⽀持ca when的⼦查询写法,所以我们需要改成join的语法。(ps:hive中也不⽀持exist或者not exist这种⼦查询⽤法)
⼀、数据库中的通常⽤法
如下,我简单写了⼀个业务场景
数据准备:qy_clue_account 线索表 和 lnk_opty 商机表,⼆者通过主键row_id和外键head_id字段关联。
SELECT
count(
DISTINCT(
CASE
WHEN(
SELECT
count(*)
FROM
lnk_opty
WHERE
STAGE ='Finish'
AND OPTY_STATE NOT IN(
'Reassign',
'AListOfLostArticles'
)
)
>0THEN
END
)
) finishedOptyNum
FROM
qy_clue_account t0
LEFT JOIN lnk_opty t1 ON t0.ROW_ID = t1.HEAD_ID
也可以换⼀种写法,放到where条件中
SELECT
count(DISTINCT( t0.row_id )) finishedOptyNum
FROM
qy_clue_account t0
LEFT JOIN lnk_opty t1 ON t0.ROW_ID = t1.HEAD_ID
WHERE
(SELECT
count(*)
FROM
lnk_opty
WHERE
STAGE ='Finish'
AND OPTY_STATE NOT IN('Reassign','AListOfLostArticles'))>0
但是这两种写法在hive中是实现不了的,下⾯具体看⼀下hive中如何改写ca when
⼆、hive案例:
需求:要查询某个字段是否在另⼀张表中,⼤概情况就是
A表:
B表:
我要查询 A表中当value2为0的时候直接输出0,为1的时候,判断value1是否在B表的value1中,如果在那么便输出0,不在便输出1, 拿到第⼀反应是:
lect
ca
when value2 =0then0
when value2 =1then
ca
when value1 in(lect value1 from B)then0
el1
end
end as value3
from A
结果Hive就报错了
⼤概意思就是:⽬前的⼦查询表达式只允许为Where条件谓词。于是我们就必须将其改为使⽤left join来解决。
lect
ca
when a.value2 =0then0
when a.value2 =1then
ca when
b.value1 is not null then0
el1
END
END as value3
from A a
left join
B b
on a.value1 = b.value1;

本文发布于:2023-05-11 20:50:18,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/590222.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:查询   条件   字段   写法
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图