Hive基础(14):HIVE语法(7)DML(4)DQL(3)流程控制语句(一) IF

语法 IF( expr1 , expr2 , expr3 )

其中, expre1是判断条件,expr2和expr3是符合expr1的自定义的返 回结果。

用处:当从数据库中查询出来的结果需要转换成中文或是其他自定义的格式的时候。

expr1 的值为 TRUE,则返回值为 expr2
expr1 的值为FALSE,则返回值为 expr3

select *,if(book_name='java','已卖完','有货') as product_status from book where price =50

也可以,通过多层嵌套的方式,达到多次判断。

select
   *,
(       
     select 
             pt_d,
             imei,
             if(expr1,A,
                 if(expre2,B,
                     if(expr3,C,
                         ................
                           if(exprn,N,                                                               
                                        m).......)))) as p1      
from table1

例二

假设通过一个 sql 聚合不同时间段的统计数据,就有可能用到 IF 函数,设定表为 stat,其中分区字段为 dt 表示日期,字段 act 分别表示 1 为曝光行为,2 为点击行为,示例如下:

SELECT
   item_id AS item_id,
   COUNT(IF(act = 1 AND dt >= 20200929 AND dt <= 20201001, 1, NULL)) AS impression_3,
   COUNT(IF(act = 2 AND dt >= 20200929 AND dt <= 20201001, 1, NULL)) AS click_3,
   IF(COUNT(IF(act = 1 AND dt >= 20200929 AND dt <= 20201001, 1, NULL)) > 0, round(COUNT(IF(act = 2 AND dt >= 20200929 AND dt <= 20201001, 1, NULL)) / COUNT(IF(act = 1 AND dt >= 20200929 AND dt <= 20201001, 1, NULL)), 4), 0) AS ctr_3,
   COUNT(IF(act = 1, 1, NULL)) AS impression_30,
   COUNT(IF(act = 2, 1, NULL)) AS click_30,
   IF(COUNT(IF(act = 1, 1, NULL)) > 0, round(COUNT(IF(act = 2, 1, NULL)) / COUNT(IF(act = 1, 1, NULL)), 4), 0) AS ctr_30,
FROM stat
WHERE dt >= 20200902
   AND dt <= 20201001 
GROUP BY item_id

如上 SQL 可以看出,一个 SQL 一次性地获取最近 3 天和 30 天的曝光(impression)、点击(click)和点击率(ctr)数据,利用 IF 多个条件划定时间范围。

 

posted @ 2021-02-18 22:28  秋华  阅读(870)  评论(0编辑  收藏  举报