行转列case when和decode对比

本文详细介绍了Oracle数据库中Decode函数和Case When语句的使用方法。Decode函数用于基于输入值返回对应的结果值,适用于相等判断,并可通过与其他函数结合实现更复杂的逻辑。Case When语句则提供更灵活的条件判断,支持多种比较运算符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Decode
Decode函数相当于一条件语句(if).它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值。区别于SQL的其它函数,Decode函数还能识别和操作空值.
语法:

decode(expr,search1,result1,

                              search2,result2,

                              ……

                              search n,result n, default)

decode函数将expr值与各search值一个一个比对,若expr值等于search值oracle数据库返回其对应的result值;若没有匹配的search值,则返回default值;若函数中default值缺省则返回null。

  1. search, result 和 default 值可以使表达式。oracle数据库使用short-circuit evaluation,简单点说就是按顺序先计算了search1的值跟expr比较,若不行则继续对search2执行一样的操作,一旦找到匹配的search值,则不再对后面的search值进行计算比对。

    2. 在比较之前,oracle自动将expr和每一个search值的数据类型转换成第一个search值的数据类型。同理也把所有result值的数据类型转换成第一个result值的数据类型。若第一个result值的数据类型为CHAR或第一个result值缺省,那么oracle就令返回值的数据类型为VARCHAR2。

     3.在decode函数中,oracle默认两个null值是相等的,若expr为null,则oracle返回search1的result为null。

     4.decode函数中包括expr,search , result 和 default 值在内,最多可包含255个参数。

延伸:

1. 与sign函数联用比较大小:

语法:select decode(sign(arg1-arg2),-1, arg1, arg2) from dual; --get arg1与arg2的较小值 

、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 子句都可以使用

三、比较

 1.DECODE 是Oracle特有的;

 2.CASE WHEN 是Oracle, SQL Server,MySQL 都可用;

 3.DECODE 只能用做相等判断,但是可以配合sign函数进行大于,小于,等于的判断;CASE可用于=,>=,<,<=,<>,is null,is not null 等的判断;

    4.DECODE 使用其来比较简洁,CASE 虽然复杂但更为灵活。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值