case在SQL中有两种写法,先建立一个表 create table salgrade(grade int, sal int);insert into salgrade values(1,1000); insert into salgrade values(2,2000); insert into salgrade values(3,3000); commit;第一种写法,简单写法: select grade,sal, case grade when 1 then 'low' when 2 then 'middle' else 'high' end from salgrade;第二种写法,查找写法: SELECT grade,sal, case when sal<=1000 then 'low' when sal<=2000 then 'middle' else 'high' end FROM salgrade;decode只能代替第一种写法: select grade,sal,decode(grade,1,'low',2,'middle','high') from salgrade;
case when 所有的数据库都通用decode oracle语法,功能都差不多不过习惯了case when的写法
case when可以判断多个条件,功能更加强大,decode判断单个条件好一点,
case 里可以写>,in 等表达式,decode只是= 本人用decode比较多
建函数索引的时候用decode比较好,oracle会自动转换case when导致无法使用到索引哦
根據個人在oracle 8.1.7中應用,談一下經驗. case when 語句可以做的 decode()語句都可以實現. 但是在oracle 8.1.7中存儲過程中不識別case when 語句(不知道後面的版本是否也有限制). case when 中用in的話= decode(字段,條件1,值1,條件2,值2.....) case when 中用>或<的話 =decode(sign(字段1-字段2),1,字段1>字段2時的值,0,字段1=字段2時的值,-1,字段1<字段2時的值)
decode只能支持等于, case可以大于小于等于, case功能强些
第二种写法的decode替代: SELECT grade,sal, decode(sign(sal-1000),1,decode(sign(sal-2000),1,'high','middle'),'low') FROM salgrade;
create table salgrade(grade int, sal int);insert into salgrade values(1,1000);
insert into salgrade values(2,2000);
insert into salgrade values(3,3000);
commit;第一种写法,简单写法:
select grade,sal,
case grade
when 1 then 'low'
when 2 then 'middle'
else 'high'
end
from salgrade;第二种写法,查找写法:
SELECT grade,sal,
case when sal<=1000 then 'low'
when sal<=2000 then 'middle'
else 'high'
end
FROM salgrade;decode只能代替第一种写法:
select grade,sal,decode(grade,1,'low',2,'middle','high') from salgrade;
简单说,decode中的if...then之后的只能是变量或具体的值,不能是表达式,是不是这个意思?
case when是标准SQL的语法,哪儿都能用,也就是说移植性更强.decode像是case when的精简版,
当要实现的功能比较简单时,用decode方便,简洁.
实现原理差不多,case更强大
本人用decode比较多
case when 語句可以做的 decode()語句都可以實現.
但是在oracle 8.1.7中存儲過程中不識別case when 語句(不知道後面的版本是否也有限制).
case when 中用in的話= decode(字段,條件1,值1,條件2,值2.....)
case when 中用>或<的話 =decode(sign(字段1-字段2),1,字段1>字段2時的值,0,字段1=字段2時的值,-1,字段1<字段2時的值)
SELECT grade,sal,
decode(sign(sal-1000),1,decode(sign(sal-2000),1,'high','middle'),'low')
FROM salgrade;