-
--简单case函数
case sex
when '1' then '男'
when '2' then '女’
else '其他' end
--case搜索函数
case when sex = '1' then '男'
when sex = '2' then '女'
else '其他' end
这两种方式,可以实现相同的功能。简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式。
还有一个需要注重的问题,case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。
比如说,下面这段sql,你永远无法得到“第二类”这个结果:
case when col_1 in ('a','b') then '第一类'
when col_1 in ('a') then '第二类'
else '其他' end
-------------------------------------------------------------------------------------------------------------------
2.批量更新数据
--假设状态只有3个选项,把所有FStatus=3的更新为1,FStatus=88的更新为5,FStatus=99的更新为9,
update T_SUF_Barcode set FStatus=(case FStatus
when '3' then '1'
when '88' then '55'
else FStatus end)
where FBarcode between '180121702150001' and '180121702153000'
----------------------------------------------------------------------------------------------------------------
3.将条码表中的状态用中文表示
select fstatus from T_SUF_Barcode t1 where FBarcode between '180121702150001' and '180121702153000'
--------------------------------------------------------------------------------------------------------------------
fstatus
1
...
5
...
5
9
...
---------------------------------------------------------------------------------------------------------------------
select t1.FBarcode, (case t1.FStatus
when 1 then '正常'
when 5 then '未知'
when 9 then '作废' end)状态
from T_SUF_Barcode t1
where FBarcode between '180121702150001' and '180121702153000'
FBarcode状态
180121702150001正常
180121702150002...
180121702150003 未知
180121702150004...
180121702150011作废
180121702150012...
4.将sum与case结合使用,可以实现分段统计。
如果现在希望将上表中各种状态的条码进行统计,sql语句如下:
select
sum(case t1.FStatus when 1 then 1 end)正常,
sum(case t1.FStatus when 5 then 2 end)未知,
sum(case when t1.FStatus !=1 and t1.FStatus!=5 then 1 end)作废
from T_SUF_Barcode t1 where FBarcode between '180121702150001' and '180121702153000'
--sum求和,当为5时,更新为2,并求和符合条件的2。这里正常,未知,作废符合条件的各有1000个数据。
正常 未知 作废
1000 2000(1000*2) 1000
--------------------------------------------
select
count(case t1.FStatus when 1 then 1 end)正常,
count(case t1.FStatus when 5 then 1 end)未知,
count(case when t1.FStatus !=1 and t1.FStatus!=5 then 1 end)作废
from T_SUF_Barcode t1 where FBarcode between '180121702150001' and '180121702153000'
--统计符合条件的个数。
正常 未知 作废
1000 1000 1000