decode是pl/sql语法,只能在oracle中使用,
case when是标准SQL的语法,哪儿都能用,也就是说移植性更强.
decode像是case when的精简版,
DECODE只能用做相等判断,但是可以配合sign函数进行大于,小于,等于的判断;CASE可用于=,>=,<,<=,<>,is null,is not null 等的判断;
当要实现的功能比较简单时,用decode方便,简洁.
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下: IF 条件=值1 THEN RETURN(翻译值1) ELSIF 条件=值2 THEN RETURN(翻译值2) ...... ELSIF 条件=值n THEN RETURN(翻译值n) ELSE RETURN(缺省值) END IF 1、比较大小 select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值 sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1 例如: 变量1=10,变量2=20 则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。 2. 比如我要查询某班男生和女生的数量分别是多少? 通常我们这么写: select count(*) from 表 where 性别 = 男; select count(*) from 表 where 性别 = 女; 要想显示到一起还要union一下,太麻烦了 用decode呢,只需要一句话 select decode(性别,男,1,0),decode(性别,女,1,0) from 表 3,order by对字符列进行特定的排序 大家还可以在Order by中使用Decode。 例:表table_subject,有subject_name列。要求按照:语、数、外的顺序进行排序。这时,就可以非常轻松的使用Decode完成要求了。 select * from table_subject order by decode(subject_name, '语文', 1, '数学', 2, , '外语',3) 4. 延伸用法: a. 与sign函数联用比较大小: 语法:select decode(sign(arg1-arg2),-1, arg1, arg2) from dual; --get arg1与arg2的较小值 实例:select decode(sign(3-5),1 ,3, 5) from dual 注:sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1 b. 表、视图结构转化: 基本思路: 使用substrb函数实现对字段的判断,然后用decode函数对数据进行重新计算,并生成新的数据和构成新的表(table or view)。
COALESCE 把表达式中的每个表达式与NULL比较,返回第一个非NULL 的表达式的值。结构如下: COALSECE (x1,x2,...,xn); CASE WHEN 语法: 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 where 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 in('Average','Bargain') 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 解释:除了可以在select 中使用CASE 外,where 子句,group by 子句,order by 子句都可以使用
先建立一个表 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; case在SQL中有两种写法, 第一种写法,简单写法: 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 and sal<>0 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;