**
SQL中的 CASE 表达式妙用这么多,你知道吗?
**
前言
历史考试选择题:黄花岗起义第一枪谁开的? A宋教仁 B孙中山 C黄兴 D徐锡麟,考生选C。
又看第二题:黄花岗起义第二枪谁开的? 考生傻了,就选了个B。
接着看第三题:黄花岗起义中,第三枪谁开的? 考生疯了,胡乱选了A。
考试出来就去找出卷老师。老师拿出课本说:黄兴连开三枪,揭开了黄花岗起义的序幕。考生:…
CASE表达式 之概念
相信大家都用过CASE表达式,尤其是做一些统计功能的时候,用的特别多,可真要说什么是 CASE表达式,我估计还真没几个人能清楚的表述出来。
CASE表达式和 “2+1” 或者 “120/3” 这样的表达式一样,是一种进行运算的功能,正如CASE(情况)这个词的含义一样,用于区分情况,在有条件分歧的时候使用它。
CASE表达式是从 SQL-92 标准开始被引入的,可能因为它是相对较新的技术,所以尽管使用起来非常便利,但其真正的价值却并不怎么为人所知。很多人不用它,或者用它的简略版函数,例如 DECODE(Oracle)、IF(MySQL)等。然而,CASE表达式也许是 SQL-92 标准里加入的最有用的特性,如果能用好它,那么 SQL 能解决的问题就会更广泛,写法也会更加漂亮,而且,因为 CASE表达式 是不依赖于具体数据库的技术,所以可以提高 SQL 代码的可移植性。
基本格式如下
– 简单 CASE表达式
CASE 列(或表达式)
WHEN <匹配值1> THEN <表达式>
WHEN <匹配值2> THEN <表达式>
…
ELSE <表达式>
END
– 搜索 CASE表达式
CASE WHEN <判断表达式> THEN <表达式>
WHEN <判断表达式> THEN <表达式>
WHEN <判断表达式> THEN <表达式>
…
ELSE <表达式>
END
– 简单 CASE表达式 示例
CASE sex
WHEN ‘1’ THEN ‘男’
WHEN ‘2’ THEN ‘女’
ELSE ‘其他’
END
– 搜索CASE表达式 示例
CASE WHEN sex = ‘1’ THEN ‘男’
WHEN sex = ‘2’ THEN ‘女’
ELSE ‘其他’
END
CASE表达式 的 ELSE子句 可以省略,但推荐不要省略,省略了可能会出现我们意料之外的结果。END不能省,必须有。当 WHEN子句 为真时,CASE表达式 的真假值判断就会中止,而剩余的 WHEN子句会被忽略。为了避免引起不必要的混乱,使用 WHEN子句 时要注意条件的排他性。
简单CASE表达式正如其名,写法简单,但能实现的功能比较有限。简单CASE表达式能写的条件,搜索CASE表达式也能写,所以基本上采用搜索CASE表达式的写法。
CASE表达式 之妙用
上面讲了 CASE表达式 的理论知识,感觉不痛不痒,那么接下来我们进入实战篇,结合一些场景来看看 CASE表达式 的妙用
行转列
可能我们用的更多的是 IF(MySQL)或 DECODE(Oracle),但这两者都不是标准的 SQL,更推荐大家用 CASE表达式,移植性更高
假设我们有如下表,以及如下数据
CREATE TABLE t_customer_credit (
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ‘自增主键’,
login_name VARCHAR(50) NOT NULL COMMENT ‘登录名’,
credit_type TINYINT(1) NOT NULL COMMENT ‘额度类型,1:自由资金,2:冻结资金,3:优惠’,
amount DECIMAL(22,6) NOT NULL DEFAULT ‘0.00000’ COMMENT ‘额度值’,
create_by VARCHAR(50) NOT NULL COMMENT ‘创建者’,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘创建时间’,
update_by VARCHAR(50) NOT NULL COMMENT ‘修改者’