当前位置:   article > 正文

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

hive case when

目录

一:case when 两种基础用法

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

三:使用注意事项

3.1 then后面不能接子查询

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

3.3 then后面能不能接两列

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


一:case when 两种基础用法

方法一:

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

方法二:

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

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

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

三:使用注意事项

3.1 then后面不能接子查询

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

  1. with tmp as(
  2. select 'yw' as name,
  3. '男' as sex
  4. union
  5. select 'wc' as name,
  6. '女' as sex
  7. )
  8. select
  9. case when name = 'yw' then (select sex from tmp where name = 'yw')
  10. when name = 'wc' then (select sex from tmp where name = 'wc')
  11. else ' 未知' end as new_sex
  12. from tmp

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

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

  1. with table_name
  2. (
  3. select 'yh' as name,
  4. '女' as sex
  5. select case
  6. when name = 'yw' then sex = '男'
  7. when name = 'wc' then sex = '女'
  8. else '未知' end as new_sex
  9. from table_name

3.3 then后面能不能接两列

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

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

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

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

  1. with table_name
  2. (
  3. select
  4. 001 as id,
  5. 'yh' as name,
  6. '女' as sex,
  7. 25 as age
  8. union
  9. select
  10. 003 as id,
  11. 'yw' as name,
  12. '女' as sex,
  13. 26 as age
  14. select id,
  15. case
  16. when name = 'yw' then '男'
  17. when name = 'wc' then '女'
  18. else '未知' end as new_sex,
  19. --
  20. case name
  21. when 'yw' then 18
  22. when 'wc' then 16
  23. else 33 end as new_age
  24. from table_name

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

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

  1. with table_name
  2. (
  3. select 001 as id,
  4. 'yh' as name,
  5. '女' as sex,
  6. 25 as age
  7. union
  8. select 003 as id,
  9. 'yw' as name,
  10. '女' as sex,
  11. 26 as age
  12. ),
  13. # 迭代更新信息后的表
  14. table_new(
  15. select 'yw' as name,
  16. '男' as sex,
  17. 18 as age
  18. union
  19. select 'yh' as name,
  20. '男' as sex,
  21. 16 as age
  22. )
  23. select
  24. t1.id,
  25. t1.name,
  26. t2.sex,
  27. t2.age
  28. from table_name t1
  29. join table_new t2
  30. on t1.name = t2.name #on的后面可以用等值连接,也可以使用like这些进行匹配连接

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/499588
推荐阅读
相关标签
  

闽ICP备14008679号