您的位置:

使用HiveQL CASE WHEN语句进行逻辑查询

一、CASE WHEN语句基础概念

CASE WHEN语句是HiveQL语言中用于进行条件判断的一种基本语法,适用于WHERE过滤和SELECT查询中。其基本语法为:

CASE WHEN condition1 THEN result1
     WHEN condition2 THEN result2
     ...
     ELSE else_result END

其中,condition1、condition2等为条件判断式,result1、result2等为对应判断式为真时的结果,else_result为当所有条件判断式都为假时的默认结果。

二、使用CASE WHEN进行单条件判断

使用CASE WHEN进行单条件判断时,可以在SELECT语句中进行条件判断并返回结果。

例如查询employees表中salary大于1000的员工姓名及其salary值,可以使用以下代码:

SELECT name, 
       CASE WHEN salary>1000 THEN salary
            ELSE NULL END as salary
FROM employees;

上述代码中,当员工的salary大于1000时,返回其salary值,否则返回NULL。

三、使用CASE WHEN进行多条件判断

使用CASE WHEN进行多条件判断时,可以依次对多个条件进行判断,并分别返回不同的结果。例如根据score列的值来将students表中的学生分为“A”、“B”和“C”三个等级:

SELECT name, 
       CASE WHEN score>90 THEN "A" 
            WHEN score>80 THEN "B" 
            ELSE "C" END as grade
FROM students;

上述代码中,当学生的score大于90时,分为A级别,当score在80~90之间时,分为B级别,否则分为C级别。

四、CASE WHEN和GROUP BY一起使用

在GROUP BY语句中使用CASE WHEN可以方便地进行数据的分组和统计。例如对orders表中amount列的值进行分组并分为三个等级,统计每个等级的订单数量和订单总金额:

SELECT CASE WHEN amount<1000 THEN "A" 
            WHEN amount<5000 THEN "B" 
            ELSE "C" END as level, 
       COUNT(*) as count, 
       SUM(amount) as total_amount
FROM orders
GROUP BY CASE WHEN amount<1000 THEN "A" 
              WHEN amount<5000 THEN "B" 
              ELSE "C" END;

上述代码中,首先将amount值使用CASE WHEN函数分为三个等级(1000以下、1000~5000、5000以上),再按照等级进行GROUP BY,统计每个等级的订单数量和总金额。

五、CASE WHEN和HAVING一起使用

HAVING语句可以在GROUP BY语句之后进行过滤,可以筛选出符合特定条件的数据。使用CASE WHEN可以方便地进行复杂条件判断。例如选择orders表中每个买家的累计消费金额并按照1000为等级进行划分,在此基础上筛选出消费金额超过5000的买家:

SELECT buyer, 
       SUM(amount) as total_amount, 
       CASE WHEN SUM(amount)<1000 THEN "A" 
            WHEN SUM(amount)<5000 THEN "B" 
            ELSE "C" END as level
FROM orders
GROUP BY buyer
HAVING CASE WHEN SUM(amount)<1000 THEN "A" 
            WHEN SUM(amount)<5000 THEN "B" 
            ELSE "C" END = "C"

上述代码中,首先按照买家进行GROUP BY,统计每个买家的累计消费金额,并按照1000为等级进行划分。然后使用HAVING语句筛选出消费金额超过5000的买家。