说明:本内容是工作用到的知识点整理,来自工作中和网络。
代码于Oracle9上测试。
作用:
1可用来进行数据资料行转列的功能
2可用来对数据进行判断,类似decode,但CASE语句在处理范围条件的时候会显得非常灵活。如果只是需要匹配少量数值时,用Decode更为简洁
3以CASE开头,以END结尾 , 分支中WHEN 后跟条件,THEN为显示结果 ELSE 为除此之外的默认情况,类似于高级语言程序中switch case的default,可以不加
语法:
Case when expression1 then result1
when expression2 then result2
……
Else result
END
例子
产品每天的销售额
制作销售额报表,通常习惯将日期作为表格的标题。
如何实现?
SELECT product_name,
category_name,
SUM((CASE
WHEN to_char(SALE_date, 'yyyy/mm/dd') = '2011/10/01' THEN sales
ELSE 0
END)) "10/01",
SUM((CASE
WHEN to_char(SALE_date, 'yyyy/mm/dd') = '2011/10/02' THEN sales
ELSE 0
END)) "10/02",
SUM((CASE
WHEN to_char(SALE_date, 'yyyy/mm/dd') = '2011/10/03' THEN sales
ELSE 0
END)) "10/03"
FROM xx_test1
GROUP BY product_name,category_name
DECODE
作用:
1 进行数据资料行转列
语法:
DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )
A Value 代表某个表的任何类型的任意列或一个通过计算所得的任何结果。
B 当每个value值被测试,如果value的值为if1,Decode 函数的结果是then1;如果value等于if2,Decode函数结果是then2;等等。
C 事实上,可以给出多个if/then 配对。
D 注意,这里的if、then及else 都可以是函数或计算表达式(加,减,乘,除)。
例子:
1)使用字段
SELECT decode(category_name,'01','Apple','Pear') FROM xx_test1
2)使用计算表达式——加,减,乘,除
SELECT decode(1+1,2,'Apple','Pear') FROM xx_test1;
SELECT decode(1-1,2,'Apple','Pear') FROM xx_test1;
SELECT decode(1*1,2,'Apple','Pear') FROM xx_test1;
SELECT decode(1/1,2,'Apple','Pear') FROM xx_test1;
3)使用函数
SELECT decode(to_char(sysdate,'mon'),'nov','冬月','dec','腊月',to_char(sysdate,'mon')) FROM dual
比较:
相同:
进行数据资料行转列
不同:
1)CaseEnd可以使用所有的表达式;Decode只是可用算术表达式,不可用逻辑表达式(= > < !=)。
2)CaseEnd可以用多个不同的字段来进行判断;Decode只可用一个字段。
3)CaseEnd是sql/92标准的一部分,哪儿都能用,也就是说移植性更强.
4)Decode是Oracle专有的。
5)用Decode方便,简洁;CaseEnd灵活。
应用场景
1) 功能比较简单时,用Decode。因为方便,简洁。
2) 要用表达式的都是CaseEnd。
3) 当Decode满足不了时就用CaseEnd。