hivesql中case when的基础总结和进阶使用

本文详细介绍了 SQL 中 CASE WHEN 的两种基本用法及其选择原则,并提供了实例帮助理解。此外,还强调了使用 CASE WHEN 时需要注意的问题,包括 THEN 子句的限制,以及如何优化涉及多列的情况。

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

目录

一:case when 两种基础用法

二:两种基础用法如何选择

三:使用注意事项

3.1 then后面不能接子查询

3.2 then后面是不是只能是结果值

3.3 then后面能不能接两列

四:如何优化接两列的情况


一:case when 两种基础用法

方法一:

case when   字段 满足条件一( eg: = 、>、like) then 结果1
     when   字段  满足条件二       then 结果2
     else  结果3  end

方法二:

case 字段
     when  值1  then     结果1
     when  值2  then    结果2
     else     结果3  end

二:两种基础用法如何选择

  • 如果需要判断的条件是枚举值,用“=”进行判断,建议使用第二种方法,简洁明了,少写代码。(方法一也可以实现)
select 
     case sex
     when '1' then '男'
     when '2' then '女'
     else ' 未知'  end
     as sex_desc
from table_sex
  • 如果需要判断的条件不是等号,例如是> 、>=、like等这种判断逻辑的,我们只能使用第一种繁琐一点的方法。(方法二实现不了
# 样例1
select 
     case when grade > 60 and grade <70 then '及格'
     case when grade >= 70 and grade <90 then '良好'
     case when grade >= 90 then '优秀'
     else '不及格'  end
     as grade_desc
from table_grade

# 样例2
select 
     case when name like '叶%' then '姓叶的人'
     case when name like '王%' then '姓王的人'
     else '既不是姓叶也不是姓王的人'  end
     as name_desc
from table_name

三:使用注意事项

3.1 then后面不能接子查询

        then的后面不能接查询语句。

with tmp as(
    select 'yw' as name,
           '男' as sex
    union 
    select 'wc' as name,
           '女' as sex
)

select 
    case when name = 'yw' then (select sex from tmp where name = 'yw')
         when name = 'wc' then (select sex from tmp where name = 'wc')
         else ' 未知' end as new_sex
from tmp

3.2 then后面是不是只能是结果值

        then的后面只能接具体的值,不能接逻辑表达式

with table_name
(
    select 'yh' as name,
           '女' as sex
)

select case
       when name = 'yw' then sex = '男'
       when name = 'wc' then sex = '女'
       else '未知' end as new_sex
from table_name

3.3 then后面能不能接两列

        then的后面不能接两列的值,如果想要接两列的值,就必须写两遍case when then逻辑。

四:如何优化接两列的情况

        case when的then后面如果有两列逻辑需要处理,我们必须写两次case when then逻辑,每一次对应一列的逻辑即可。

方法一:常规方法:两次case when then逻辑

with table_name
(
    select 
            001 as id,
           'yh' as name,
           '女' as sex,
            25  as age
    union 
    select 
           003 as id,
           'yw' as name,
           '女' as sex,
            26  as age
)

select id,
       case
       when name = 'yw' then '男'
       when name = 'wc' then '女'
       else '未知' end as new_sex,
       --
       case name 
       when 'yw' then 18
       when 'wc' then 16
       else 33 end as new_age
from table_name

方法二:先把then后面的两列放在对应一个表存储着,我们使用join来进行连接,连接条件就是when后面的对应条件

     因为方法一有两次case when条件匹配,效率可能不高

with table_name
(
    select 001  as id,
           'yh' as name,
           '女' as sex,
            25  as age
    union 
    select 003 as id,
           'yw' as name,
           '女' as sex,
            26  as age
),
# 迭代更新信息后的表
table_new(
     select 'yw' as name,
            '男' as sex,
            18   as age
     union
     select 'yh' as name,
            '男' as sex,
            16   as age
)

select 
    t1.id,
    t1.name,
    t2.sex,
    t2.age
from table_name t1
join table_new t2
on t1.name = t2.name #on的后面可以用等值连接,也可以使用like这些进行匹配连接

Hive中进行联接时,并不直接使用case when语句。case when语句通常用于条件判断值的替换。在Hive中进行联接操作,可以使用JOIN语句来实现。JOIN是一种在两个或多个表之间建立关联的操作,通过连接条件将表中的数据进行匹配组合。 例如,在Hive中进行内连接时可以使用INNER JOIN关键字,语法如下: SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column; 这样会根据指定的连接条件,将table1table2中的数据进行匹配,并返回满足条件的结果集。根据需要可以选择不同类型的JOIN操作,如内连接、左连接、右连接等。 在进行JOIN操作时,可以使用case when语句来处理一些条件逻辑,但它通常是作为连接条件的一部分,而不是直接用于联接操作本身。 综上所述,在Hive中进行联接时,并不直接使用case when语句,而是使用JOIN语句进行表的连接操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [hivesqlcase when基础总结进阶使用](https://blog.csdn.net/yezonghui/article/details/125581823)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [SqlServer使用 case when 解决多条件模糊查询问题](https://download.csdn.net/download/weixin_38692100/12829973)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值