Oracle中除數為0的兩種解決辦法(decode與nullif)


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) 是等效的。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM