语法二表达:
CASE v_grade
WHEN 'A' THEN
v_result := 'Excellent';
WHEN 'B' THEN
v_result := 'Very Good';
WHEN 'C' THEN
v_result := 'Good';
WHEN 'D' THEN
v_result := 'Fair';
WHEN 'F' THEN
v_result := 'Poor';
ELSE
v_result := 'No such grade';
END CASE;
可以看出,语法一的表达能力要强于语法二,因为语法二是单值比较,而语法一是表达式计算。通常,凡是语法二能表达的,语法一均能表达,反之则不然。例如,语法一可以方便的判断大于或者小于等关系,语法二则只能判断等于。
注意,Oracle并没有提供在SQL语句中使用的CASE函数。
前面讲到,CASE语句的语法二的表达能力有限。由于DECODE的功能相当于CASE语句的语法二,因此DECODE的表达能力也是有限的。对于9i之前版本的用户,有时面临着表达能力不够的问题。特别是从MSSQL迁移时,由于MSSQL提供了CASE语句,造成表达能力的不一致。
这里为读者提供一种技巧,使用DECODE来表达复杂的关于,例如大于逻辑。
假定有一张证券交易表fsjour,其中的列stock_code表示证券代码,我们使用DECODE来计算出stock_code所属的股票种类。
其规则为:当stock_code在600000和699999之间为“沪A”,在000000和099999之间为“深A”,否则为“其他”。
select DECODE(1, (select 1 from dual
where stock_code between '600000' and '699999'), '沪A',
(select 1 from dual
where stock_code between '000000' and '099999'), '深A',
'其他')
from fsjour;
这里的技巧是将复杂的条件转移到子语句的WHERE部分。
如果两个子语句的结果相同,那么前面一个的结果将被返回。
运用这种技巧,可以用DECODE实现CASE语句语法一的功能,但是语句会显得相当复杂。
(编辑:aniston)
|