天天看点

oracle中的case用法详解

case语句的种类:

1.简单case语句

语法:

case exp when comexp then returnvalue

when comexp then returnvalue

else returnvalue

end

case到end之间相当于一个具体的值,可以做运算,取别名,嵌套case 等等。

只要把case到end当作一个运算结果的表达式就可以了。

举例:

select cust_last_name,

case credit_limit when 100 then ‘low’

when 5000 then ‘high’

else ‘medium’

end

from customers;

2.搜索case语句

语法:

case when boolean then return value

when boolean then return value

else retur nvalue

end

举例:

select case when id between 1 and 10 then ‘low’

when id between 20 and 30 then ‘mid’

when id between 40 and 50 then ‘high’

else ‘unknow’

end

from product;

简单case和搜索case之间的区别:

1.简单case只能是when后面的表达式完全匹配case后的表达式,相当于 =,所以也不能匹配null。

2. searched case可以作为比较条件,那么可以使用like、!=、between …and、<、=、is null、is not null等,比简单case的使用更加广泛,完全可以替代简单case。

注意事项:

1.case 表达式返回的是一个确定的value,若前面的都不匹配,则返回else中的项.

2.简单case 中的表达式,when 后面的表达式类型应该全部保持一致.

3.所有的then 后面的return_value类型要保持一致.

4.对于简单case 表达式,也就是case 表达式 when…那么when null 总是取不到。也就是case 后面的表达式如果值为null,不会与when null 匹配,只会与else匹配.

5.对于searched case来说,有自动类型转换,只要条件成立就可以。

如:select case when 1=‘1’ then 1 end from dual; 其中1='1’条件成立

值得一提的是: sql中的case语句与pl/sql中的case语句的不同之处:

前者的else不是必须的,如果没有匹配就返回null;后者的else不写,则报case_not_found异常.

case中嵌套子查询

Case语句中可以使用子查询,但是必须返回一行,不可以是多行.

如:

select case (select count() as s1 from t1 where a = 1)

when (select count() as s2 from t1, t2 where t1.a = t2.a and t2.a = 1) then ‘相等’

else ‘不相等’

end

from dual;