sql中的case语句
Published by admin on 03月 26, 2009
语法:
case <expression> when <expression>|<search_condition> then <result>
else <result> end
示例:
select case qtr
when ‘Q1_98′ then ‘1st Quarter’
when ‘Q2_98′ then ‘2nd Quarter’
when ‘Q3_98′ then ‘3rd Quarter’
when ‘Q4_98′ then ‘4th Quarter’
end as Period,
sum (dollars) as results
from sales natural join period
————————
Case具有两种格式。简单Case函数和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部分将会被自动忽略。
—————————-
首先看一下,Case的语法:
case when 条件A Then 结果A When 条件B 结果B …….. else 结果N end
和Decode 不同的是,Decode 只能针对固定的值,而 Case 可以用不是固定值,需是一个条件。
现在有以下的需求,有一个字符串,最后的两位可能是 ’/R’ ,’/T’ 另外,有的后两位没有前面的’/R’ ,’/T’ ,现在针对不同的需要,要将 ’/R’ ,’/T’ 取掉,没有 ’/R’ ,’/T’, 就不做处理。
具体字符串如下: A01JCL-A01JCL/GF117F0001TR/R
SQL写法可以如下:
select (case
when instr(code, ’/R’) > 0 then
substr(code, 1, instr(code, ’/R’) - 1)
when instr(code, ’/T’) > 0 then
substr(code, 1, instr(code, ’/T’) - 1)
else
’0’
end)
from table_A t ;
使用Case时,要用括号括起来。
——————–
在一般的 SELECT 中,其语法如下:
SELECT =
CASE
WHEN THEN
WHEN THEN
ELSE
END
下面是一个简单的例子:
USE pubs
GO
SELECT
Title,
‘Price Range’ =
CASE
WHEN price IS NULL THEN ‘Unpriced’
WHEN price < 10 THEN ‘Bargain’
WHEN price BETWEEN 10 and 20 THEN ‘Average’
ELSE ‘Gift to impress relatives’
END
FROM titles
ORDER BY price
GO
对于informix不能用以上形式,可以如下:
USE pubs
GO
SELECT
Title,
CASE
WHEN price IS NULL THEN ‘Unpriced’
WHEN price < 10 THEN ‘Bargain’
WHEN price BETWEEN 10 and 20 THEN ‘Average’
ELSE ‘Gift to impress relatives’
END
Price Range
FROM titles
ORDER BY price
GO
这是 CASE 的典型用法,但是使用 CASE 其实可以做更多的事情。比方说下面的 GROUP BY 子句中的 CASE:
SELECT ‘Number of Titles’, Count(*)
FROM titles
GROUP BY
CASE
WHEN price IS NULL THEN ‘Unpriced’
WHEN price < 10 THEN ‘Bargain’
WHEN price BETWEEN 10 and 20 THEN ‘Average’
ELSE ‘Gift to impress relatives’
END
GO
你甚至还可以组合这些选项,添加一个 ORDER BY 子句,如下所示:
USE pubs
GO
SELECT
CASE
WHEN price IS NULL THEN ‘Unpriced’
WHEN price < 10 THEN ‘Bargain’
WHEN price BETWEEN 10 and 20 THEN ‘Average’
ELSE ‘Gift to impress relatives’
END AS Range,
Title
FROM titles
GROUP BY
CASE
WHEN price IS NULL THEN ‘Unpriced’
WHEN price < 10 THEN ‘Bargain’
WHEN price BETWEEN 10 and 20 THEN ‘Average’
ELSE ‘Gift to impress relatives’
END,
Title
ORDER BY
CASE
WHEN price IS NULL THEN ‘Unpriced’
WHEN price < 10 THEN ‘Bargain’
WHEN price BETWEEN 10 and 20 THEN ‘Average’
ELSE ‘Gift to impress relatives’
END,
Title
GO
对于informix中形式有所不同,例子
select
case when td_acc1_no[1,3]=’610′ then get_contrast(td_acc1_no)
else get_contrast(td_td_acct_no)
end sx_acct_no
, sum(td_actu_amt) sx_bal
from dcc_tdacnacn where td_td_acct_no in (’6107111001014107111000050182′,
‘6107111001014107111000050168′)
group by 1
注意,为了在 GROUP BY 块中使用 CASE,查询语句需要在 GROUP BY 块中重复 SELECT 块中的 CASE 块。
除了选择自定义字段之外,在很多情况下 CASE 都非常有用。再深入一步,你还可以得到你以前认为不可能得到的分组排序结果集。
—————————-
informix的sql中,无论case语句是在普通查询语句中还是在存储过程中,执行情况基本一致。通常情况下条件只符合一条当然没有疑问。就以下两种情况尤其是第一种情况需要注意。
1、在满足条件的when子句存在多条的情况下,仅第一条有效,后面的都不执行;
2、在存储过程的case语句中如果没有when只有else,则直接执行else后的语句。当然这样的情况最好避免。
可以理解为case就是执行满足条件的第一条语句后就跳出case语句。
另外存储过程中case后变量值只计算一次,也就是说即使case语句中改变了变量值是不会影响后面的判断的。
—————————–
select
sum(case when(BisTotalEmployees>0 and BisTotalEmployees<=30) then 1 else 0 end) as a,
sum(case when(BisTotalEmployees>30 and BisTotalEmployees<=50) then 1 else 0 end) as b,
sum(case when(BisTotalEmployees>50 and BisTotalEmployees<=100) then 1 else 0 end) as c
from ERP.T_CORPBASEINFO_11
where LegalStatusCode=’310′
——————–
select sum(case x.预算比例
when a then x.实纳税额*0.15
when b then x.实纳税额*0.25
when c then x.实纳税额*0.5
end ) as 收入
from [明细表] x

Add A Comment