yzq 发表于 2018-10-20 07:53:56

SQL CASE 的用法


[*]  --简单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 FStatusend)
  where   FBarcodebetween '180121702150001' and '180121702153000'
  ----------------------------------------------------------------------------------------------------------------
  3.将条码表中的状态用中文表示
  select fstatus from T_SUF_Barcode t1   where   FBarcodebetween '180121702150001' and '180121702153000'
  --------------------------------------------------------------------------------------------------------------------
  fstatus
  1
  ...
  5
  ...
  5
  9
  ...
  ---------------------------------------------------------------------------------------------------------------------
  select t1.FBarcode, (case t1.FStatus
  when1 then '正常'
  when5 then '未知'
  when9 then '作废' end)状态
  from T_SUF_Barcode t1
  where   FBarcodebetween '180121702150001' and '180121702153000'
  FBarcode状态
  180121702150001正常
  180121702150002...
  180121702150003未知
  180121702150004...
  180121702150011作废
  180121702150012...
  4.将sum与case结合使用,可以实现分段统计。
  如果现在希望将上表中各种状态的条码进行统计,sql语句如下:
  select
  sum(case t1.FStatus when 1 then 1end)正常,
  sum(case t1.FStatus when 5 then 2end)未知,
  sum(casewhen t1.FStatus !=1 and t1.FStatus!=5 then 1end)作废
  from T_SUF_Barcode t1where   FBarcodebetween '180121702150001' and '180121702153000'
  --sum求和,当为5时,更新为2,并求和符合条件的2。这里正常,未知,作废符合条件的各有1000个数据。
  正常未知          作废
  10002000(1000*2)   1000
  --------------------------------------------
  select
  count(case t1.FStatus when 1 then 1end)正常,
  count(case t1.FStatus when 5 then 1end)未知,
  count(casewhen t1.FStatus !=1 and t1.FStatus!=5 then 1end)作废
  from T_SUF_Barcode t1where   FBarcodebetween '180121702150001' and '180121702153000'
  --统计符合条件的个数。
  正常未知作废
  100010001000

页: [1]
查看完整版本: SQL CASE 的用法