Oracle中Decode函數,語句DECODE(tag,''ZCGS'',0,1)=decode(''@corp-No@'',''6010'',1,0)
decode(字段或字段的運算,值1,值2,值3)
這個函數運行的結果是,當字段或字段的運算的值等於值1時,該函數返回值2,否則返回值3
當然值1,值2,值3也可以是表達式,這個函數使得某些sql語句簡單了許多
1.decode
利用decode函數:
select decode(b,0,0,a/b) from dual;
1
當b = 0時,返回0,否則才返回a/b的結果。
2.nullif
先來說一下nullif的語法。
nullif(expr1,expr2)
1
如果兩個參數相等,返回null,否則返回第一個。第一個參數不可指定為空。對於非數字類型參數,數據類型必須一致。對於數值數據類型,會隱式的轉化為更高優先級的數據類型。(這個理解可能有誤,我測試了int,integer,float。但是最終都轉化為number類型)。
一般來說,我們處理“除數為零”的問題會用到decode(當然也可以用case,但是寫起來代碼更多些)。比如
dividend / decode(divisor, 0, null, divisor)
1
但是在除數divisor非常復雜的時候,就需要把這一大串代碼寫兩遍,或者是再套一層view。無論是哪種,都是極其不利於維護的。
1 /
decode((sum(t.val) over(order by t.c) +
nvl(lead(val) over(partition by b order by c), 0)) /
sum(val) over(partition by b order by c),
0,
null,
(sum(t.val) over(order by t.c) +
nvl(lead(val) over(partition by b order by c), 0)) / sum(val)
over(partition by b order by c))
對於這種復雜表達式的除數,每回修改都要改兩遍,很容易出錯。
利用nullif,可以讓除數只寫一次。
因為 decode(divisor, 0, null, divisor) 與 nullif(divisor, 0) 是等效的。