天天看點

《Oracle SQL疑難解析》——.13 在語句中找到和消除空值

本節書摘來自異步社群出版社《oracle sql疑難解析》一書中的第1章,第1.13節,作者: 【美】grant allen , bob bryla , darl kuhn,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

oracle sql疑難解析

我們需要統計出公司中,有多少員工的薪酬裡含銷售提成(commission percentage),有多少員工的薪酬是固定工資。我們可以用hr.employees表中的commission_pct字段來獲得資料。

hr.employees表的結構允許commission_pct字段為空值。有兩個查詢語句可以分别查找commission percent為空值的人和為非空值的人。首先,查找commission percentage為空值的員工:

現在查找commission percentage為非空值的人員:

第一個select語句用“commission_pct is null”子句測試null項。這隻會出現兩個結果:要麼字段為空,即沒有值,滿足查詢條件;要麼字段有值。

第二個語句用“commission_pct is not null”子句,這将找出commission_pct 實際值對應的所有employee。

oracle對空字元串的非标準處理

sql标準做法是用空或零長度的字元串來代表null值,而oracle并非如此。其中曆史的、地域的原因我們無需深究,但一定要記住,oracle對null的規定和用法。對于幾乎所有的其他資料庫,sql都把空字元串當作一個獨立的、已知的值。

有程式設計背景的人會發現一些類似的規定,一個0長度的字元串隻有一個字元串終結符(0)作為其内容。相反,一個加密的字元串沒有确定的狀态……即使是一個終結符。我們不能把0長度和未知狀态的字元串進行互換,這類似于oracle如何對待null。

在sql中涉及null值的使用訣竅,也是每天必須面對的功課,這經常讓人不知所措。每個sql表達式的結果都是三個值選一:“真”、“假”或“空”。在各種比較、邏輯操作和判斷中都是如此。但為避免偶爾的遺忘,我們還是要一再地強調:null不跟任何值相等,任何值不跟null相等,null不等于null。試着運作下面的語句,看看你能預猜到答案嗎?

結果是沒有任何行傳回。即使從前面的select查詢中看到employee_id是72的員工的commission_pct為null,但因為null不等于null,是以commission_pct=null是不成立的,是以查詢的結果是沒有記錄傳回。記住,不要用“=”号,而是永遠用“is null”或“is not null”來尋找或排除null值。