sql :case when & if 表达式

CASE WHEN 及 SELECT CASE WHEN的用法


一,已知数据按照另外一种方式进行分组,分析。

有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为Primary Key)

CASE <wbr>WHEN <wbr>及 <wbr>SELECT <wbr>CASE <wbr>WHEN的用法

根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。

CASE <wbr>WHEN <wbr>及 <wbr>SELECT <wbr>CASE <wbr>WHEN的用法
   解决这个问题,你会怎么做?生成一个带有洲Code的View是一个解决方法,但是这样很难动态的改变统计的方式。如果使用Case函数,SQL代码如下:

SELECT  SUM(population), 

CASE country  WHEN '中国' THEN '亚洲' 

  WHEN '印度' THEN '亚洲' 

  WHEN '日本' THEN '亚洲' 

  WHEN '美国' THEN '北美洲' 

  WHEN '加拿大'  THEN '北美洲' 

  WHEN '墨西哥'  THEN '北美洲' 

ELSE '其他' END 

FROM    Table_A 

GROUP BY

CASE country 

WHEN '中国' THEN '亚洲' 

WHEN '印度' THEN '亚洲'

WHEN '日本' THEN '亚洲' 

WHEN '美国' THEN '北美洲' 

WHEN '加拿大'   THEN '北美洲' 

WHEN '墨西哥'   THEN '北美洲' 

ELSE '其他' END; 
同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下:

SELECT 

CASE WHEN salary <= 500 THEN '1' 

WHEN salary > 500 AND salary <= 600  THEN '2' 

WHEN salary > 600 AND salary <= 800  THEN '3' 

WHEN salary > 800 AND salary <= 1000 THEN '4' 

ELSE NULL END salary_class, -- 别名命名

COUNT(*)  FROM    Table_A 

GROUP BY 

CASE WHEN salary <= 500 THEN '1' 

WHEN salary > 500 AND salary <= 600  THEN '2' 

WHEN salary > 600 AND salary <= 800  THEN '3' 

WHEN salary > 800 AND salary <= 1000 THEN '4' 

ELSE NULL END; 


二,用一个SQL语句完成不同条件的分组。

有如下数据

CASE <wbr>WHEN <wbr>及 <wbr>SELECT <wbr>CASE <wbr>WHEN的用法


按照国家和性别进行分组,得出结果如下
CASE <wbr>WHEN <wbr>及 <wbr>SELECT <wbr>CASE <wbr>WHEN的用法

   普通情况下,用UNION也可以实现用一条语句进行查询。但是那样增加消耗(两个Select部分),而且SQL语句会比较长。下面是一个是用Case函数来完成这个功能的例子
SELECT country, 

SUM( CASE WHEN sex = '1' THEN  population ELSE 0 END),  --男性人口 

SUM( CASE WHEN sex = '2' THEN  population ELSE 0 END)   --女性人口

FROM  Table_A  GROUP BY country; 


这样我们使用Select,完成对二维表的输出形式,充分显示了Case函数的强大。

 三.if 表达式

IF( expr1 , expr2 , expr3 )

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

如下:

SELECT IF(TRUE,1+1,1+2);
-> 2

SELECT IF(FALSE,1+1,1+2);
-> 3

SELECT IF(STRCMP("111","222"),"不相等","相等");
-> 不相等

猜你喜欢

转载自blog.csdn.net/qq_34706955/article/details/81219415