expr1與expr2相等返回NULL,不等則返回expr1 注意類型要一致
NVL2 (expr1, expr2, expr3)
expr1不為NULL,返回expr2;為NULL,則返回expr3
NVL (expr1 , expr2)
expr1為NULL,則返回expr2. 如果expr1不為NULL,則返回expr1
decode (expression, search_1, result_1, search_2, result_2, ., search_n, result_n, default)
decode函數比較表達式和搜索字,如果匹配,返回結果;如果不匹配,返回default值;如果未定義default值,則返回空值。
使用方法:
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、表、视图结构转化
现有一个商品销售表sale,表结构为:
month char(6) --月份
sell number(10,2) --月销售金额
现有数据为:
200001 1000
200002 1100
200003 1200
200004 1300
200005 1400
200006 1500
200007 1600
200101 1100
200202 1200
200301 1300
想要转化为以下结构的数据:
year char(4) --年份
month1 number(10,2) --1月销售金额
month2 number(10,2) --2月销售金额
month3 number(10,2) --3月销售金额
month4 number(10,2) --4月销售金额
month5 number(10,2) --5月销售金额
month6 number(10,2) --6月销售金额
month7 number(10,2) --7月销售金额
month8 number(10,2) --8月销售金额
month9 number(10,2) --9月销售金额
month10 number(10,2) --10月销售金额
month11 number(10,2) --11月销售金额
month12 number(10,2) --12月销售金额
结构转化的SQL语句为:
create or replace view v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8
,month9,month10,month11,month12)
select
substrb( month , 1 , 4 ),
sum (decode(substrb( month , 5 , 2 ), ' 01 ' ,sell, 0 )),
sum (decode(substrb( month , 5 , 2 ), ' 02 ' ,sell, 0 )),
sum (decode(substrb( month , 5 , 2 ), ' 03 ' ,sell, 0 )),
sum (decode(substrb( month , 5 , 2 ), ' 04 ' ,sell, 0 )),
sum (decode(substrb( month , 5 , 2 ), ' 05 ' ,sell, 0 )),
sum (decode(substrb( month , 5 , 2 ), ' 06 ' ,sell, 0 )),
sum (decode(substrb( month , 5 , 2 ), ' 07 ' ,sell, 0 )),
sum (decode(substrb( month , 5 , 2 ), ' 08 ' ,sell, 0 )),
sum (decode(substrb( month , 5 , 2 ), ' 09 ' ,sell, 0 )),
sum (decode(substrb( month , 5 , 2 ), ' 10 ' ,sell, 0 )),
sum (decode(substrb( month , 5 , 2 ), ' 11 ' ,sell, 0 )),
sum (decode(substrb( month , 5 , 2 ), ' 12 ' ,sell, 0 ))
from sale
group by substrb( month , 1 , 4 );