KinG 发表于 2013-2-4 20:00:59

SQL中CASE条件表达式

SQL CASE 表达式是一种通用的条件表达式,类似于其它语言中的 if/else 语句。

CASE WHEN condition THEN result


END
CASE 子句可以用于任何表达式可以有效存在的地方。 condition 是一个返回boolean 的表达式。 如果结果为真,那么 CASE 表达式的结果就是符合条件的 result。 如果结果为假,那么以相同方式搜寻任何随后的 WHEN 子句。 如果没有 WHEN condition 为真,那么 case 表达式的结果就是在 ELSE 子句里的值。 如果省略了 ELSE 子句而且没有匹配的条件, 结果为 NULL。

例子:

SELECT * FROM test;
a
---
1
2
3
SELECT a,
CASE WHEN a=1 THEN 'one'
WHEN a=2 THEN 'two'
ELSE 'other'
END
FROM test;
a | case
---+-------
1 | one
2 | two
3 | other


所有 result 表达式的数据的类型都必须可以转换成单一的输出类型。

下面这个"简单的" CASE 表达式是上面的通用形式的一个特殊的变种。

CASE expression
WHEN value THEN result


END
先计算 expression 的值, 然后与所有在WHEN 子句里声明的 value 对比,直到找到一个相等的。 如果没有找到匹配的,则返回在 ELSE 子句里的 result (或者 NULL)。 这个类似于 C 里的 switch 语句。

上面的例子可以用简单 CASE 语法来写:

SELECT a,
CASE a WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
ELSE 'other'
END
FROM test;
a | case
---+-------
1 | one
2 | two
3 | other


CASE 表达式并不计算任何对于判断结果并不需要的子表达式。 比如,下面是一个可以避免被零除的方法:

SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
例1:一道SQL语句面试题
表内容:
2005-05-09 胜
2005-05-09 胜
2005-05-09 负
2005-05-09 负
2005-05-10 胜
2005-05-10 负
2005-05-10 负

如果要生成下列结果, 该如何写sql语句?

            胜 负
2005-05-0922
2005-05-1012
----------------------------------------------------------
create table #tmp(rq varchar(10),shengfu nchar(1))

insert into #tmp values('2005-05-09','胜')
insert into #tmp values('2005-05-09','胜')
insert into #tmp values('2005-05-09','负')
insert into #tmp values('2005-05-09','负')
insert into #tmp values('2005-05-10','胜')
insert into #tmp values('2005-05-10','负')
insert into #tmp values('2005-05-10','负')
select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',
         sum(case when shengfu='负' then 1 else 0 end)'负'
         from #tmp group by rq
----------------------------------------------------------






例2:表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。










select (case when a>b then a else b end ),
       (case when b>c then b esle c end)
       from table_name

----------------------------------------------------------
例3:有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):
   大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。
       显示格式:
       语文            数学                英语
       及格            优秀                不及格   
----------------------------------------------------------
select
    (case when 语文>=80 then '优秀'
          when 语文>=60 then '及格'
          else '不及格' end) as 语文,
    (case when 数学>=80 then '优秀'
          when 数学>=60 then '及格'
          else '不及格' end) as 数学,
    (case when 英语>=80 then '优秀'
          when 英语>=60 then '及格'
          else '不及格' end) as 英语,
from table

++++++++++++++++++++++++++++++++++++++++++++++++++++
select fuserid,
case
whenfuserid=28 then 'qq'
whenfuserid=29 then 'qs'
else 'aa' end)as 'ss'
from t_sys_grightdetail
页: [1]
查看完整版本: SQL中CASE条件表达式