oracle 使用nullif解決除數為零的問題
先來說一下nullif的語法。
NULLIF compares expr1 and expr2. If they are equal, then the function returns null. If they are not equal, then the function returns expr1. You cannot specify the literal NULL for expr1.
If both arguments are numeric data types, then Oracle Database determines the argument with the higher numeric precedence, implicitly converts the other argument to that data type, and returns that data type. If the arguments are not numeric, then they must be of the same data type, or Oracle returns an error.
The NULLIF function is logically equivalent to the following CASE expression:
CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
如果兩個引數相等,返回null,否則返回第一個。第一個引數不可指定為空。對於非數字型別引數,資料型別必須一致。對於數值資料型別,會隱式的轉化為更高優先順序的資料型別。(這個理解可能有誤,我測試了int,integer,float。但是最終都轉化為number型別)。
一般來說,我們處理“除數為零”的問題會用到decode(當然也可以用case,但是寫起來程式碼更多些)。比如
dividend / decode(divisor, 0, null, divisor)
但是在除數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)
是等效的。
相關文章
- VSCode除錯Flutter的問題解決VSCode除錯Flutter
- 解決codeblocks無法除錯的問題BloC除錯
- JDBC Oracle executeUpdate 卡死問題解決JDBCOracle
- 解決Oracle序列跳號問題Oracle
- 解決Oracle死鎖問題步驟Oracle
- 解決程式(因為數字的問題)沒反應的方法
- ORACLE賬戶提示EXPIRED(GRACE)問題解決Oracle
- Oracle:ORA-27090 問題解決總結Oracle
- vue 新增axios解決post傳引數為null問題VueiOSNull
- 使用動態規劃完美解決硬幣找零問題(Python)動態規劃Python
- 解決無法使用VI的問題
- java解決數字黑洞問題Java
- 解決sqlserver資料庫單一使用者無法刪除的問題SQLServer資料庫
- 元規劃:使用規劃器解決數學問題
- 怎樣成為解決問題的高手?——關於問題解決的關鍵4步驟
- Oracle 錯誤總結及問題解決 ORAOracle
- [Oracle] “表中有資料,但select count(*)的結果為0”問題的解決辦法Oracle
- 01 Eclipse使用Maven慢的問題解決EclipseMaven
- 使用Nginx來解決跨域的問題Nginx跨域
- 全域性替換 ‘/home’ 為 ‘/’ 的問題解決!
- 【NX/UG】解決:使用重用庫的零件,下次開啟發現零件丟失問題
- Microsoft聯手Apple,為iCloud使用者解決相容問題ROSAPPCloud
- [20200213]函式nullif使用.txt函式Null
- Oracle 解決like中無法匹配下劃線的問題Oracle
- 將函式作為引數傳遞解決非同步問題函式非同步
- Oracle EXPDP自動備份緩慢問題解決Oracle
- 使用async/await更好的解決非同步問題AI非同步
- 解決 Unexpectedlexicaldeclarationincaseblock的問題BloC
- spingboot使用@Resource注入靜態變數報空指標的問題解決boot變數指標
- DMAIC如何作為解決問題的方法執行?AI
- MyBatisPlus解決邏輯刪除與唯一索引的相容問題MyBatis索引
- Jekyll 本地除錯部落格遇到的問題及解決辦法除錯
- 10款解決數學問題的最佳AI工具AI
- idea 使用日常問題 使用maven外掛 打包沒問題 但是使用 mvn命令打包失敗的問題解決IdeaMaven
- [文件教程]解決SAE下本地除錯相關問題除錯
- oracle程式異常中止時登入掛起問題的解決Oracle
- WPF 解決 CommandParameter 引數不更新問題
- Oracle:sqlplus查詢出的中文是亂碼問題的解決(轉)OracleSQL