在mysql等关系型数据库中,case when 函数在条件判断中是我们经常使用的函数。同样的hive中也有这个函数。但是由于hive不支持case 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'
)
) > 0 THEN
t0.row_id
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中如何改写case when
二、hive案例:
需求:要查询某个字段是否在另一张表中,大概情况就是
A表:
B表:
我要查询 A表中当value2为0的时候直接输出0,为1的时候,判断value1是否在B表的value1中,如果在那么便输出0,不在便输出1, 拿到第一反应是:
select
case
when value2 = 0 then 0
when value2 = 1 then
case
when value1 in (select value1 from B) then 0
else 1
end
end as value3
from A
结果Hive就报错了
大概意思就是:目前的子查询表达式只允许为Where条件谓词。
于是我们就必须将其改为使用left join
来解决。
select
case
when a.value2 = 0 then 0
when a.value2 = 1 then
case when
b.value1 is not null then 0
else 1
END
END as value3
from A a
left join
B b
on a.value1 = b.value1;