case函数详解

  • Post author:
  • Post category:其他


case函数通常也被称为:流程控制函数

主要有两种形式

  1. 简单case函数


通常用于情况不多且可枚举出来的情况

通常形式如下:

CASE  <col_name>
   WHEN <value1> THEN <result1>
   WHEN <value2> THEN <result2>
   ...
   ELSE <result>
END 

例如:

CASE sex
    WHEN '0' THEN '男'
    WHEN '1' THEN '女'
ELSE '其他' END
  1. case搜索函数


类似if判断,case搜索函数可以写判断,并且只会返回第一个符合条件的值,其他case被忽略

通常形式如下:

CASE
    WHEN <条件1> THEN <结果1>
    WHEN <条件2> THEN <结果2>
    ...
    ELSE <结果>
END

例如:

case 
when  score<60  then"不及格"
when  score <=70  then "及格"
when  score<=80   then "中等"
when  score<=90   then "优良"
else   "优秀"
end 

case可以帮助我们解决许多问题,下面可以列举几种适用的场景

  • 说到分类,在SQL中应该首选GROUP BY。然而GROUP BY也不是万能的,如果有进行范围分类,就有些力不从心了,需要与CASE配合才能完成。比如:当前用户表(T_USER)中有100万条数据,用户记录中有年龄字段(age),我们现在划分年龄小于18岁的是未成年成、大于等于18岁小于40岁的年轻人、大于等于40岁小于60岁的是中年人、大于等于60岁的是老年人,现需要统计各类人群的数量。
SELECT
    CASE age
        WHERE age < 18 THEN '未成年人'
        WHERE age >= 18 AND age < 40 THEN '年轻人'
        WEHRE age >= 40 AND age < 60 THEN '中年人'
        WHERE age >= 60 THEN '老年人'
    ELSE '其他' END '人群类型',
    COUNT(*) '数量'
FROM T_USER
GROUP BY
    CASE age
        WHERE age < 18 THEN '未成年人'
        WHERE age >= 18 AND age < 40 THEN '年轻人'
        WEHRE age >= 40 AND age < 60 THEN '中年人'
        WHERE age >= 60 THEN '老年人'
    ELSE '其他' END
  • 降维

    这里的降维主要是降低数据库查询次数,我们可以将数据库的每个select作为数据的一个维度,维度越高,数据库服务器处理该数据的资源消耗就越多,子查询就是一个极度消耗资源的查询方式。这里就给出一个减少子查询的案例,如:同样是“分类”栏目下的那个表(T_USER),人群分类相同,另外说明:用户表中的用户来自于国内的不同省(province)。现在需要统计的是,各省的各类人群的数量。

SELECT province,
    SUM( CASE age WHERE age < 18 THEN 1 ELSE 0 END) '未成年人',
    SUM( CASE age WHERE age >= 18 AND age < 40 THEN 1 ELSE 0 END) '年轻人',
    SUM( CASE age WHERE age >= 40 AND age < 60 THEN 1 ELSE 0 END) '中年人',
    SUM( CASE age WHERE age >= 60 THEN 1 ELSE 0 END) '老年人',
FROM T_USER
GROUP BY
    province

实际例子

SELECT  a.id
       ,(case WHEN ASCII(SUBSTR(a.cgsqdhnew,1,1))>65 THEN '字母' ELSE '数值' END) AS ww
FROM formtable_main_200_dt1 a
WHERE 1=1 
SELECT  (case WHEN ascii(substr(b.cgsqdhnew,1,1))>65 THEN b.Cgsqdhnew ELSE (
SELECT  BH
FROM formtable_main_240
WHERE requestid = b.Cgsqdhnew) END) AS Cgsqdhnew 
FROM table



版权声明:本文为m0_52390420原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。