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

本文探讨了在Hive中使用CaseWhen函数的限制,特别是在子查询中的问题,并提供了一种使用LeftJoin来替代子查询的解决方案。通过实际案例,详细展示了如何将包含子查询的CaseWhen语句转换为LeftJoin语法,以适应Hive的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清平乐的技术博客

你的鼓励是我最大创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值