ORACLE 中DECODE和 CASE WHEN函数使用方式


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;

猜你喜欢

转载自fjjj8.iteye.com/blog/2279087