在使用NULL值時,我們一定要記住下面幾條規則,避免發生一些常見的錯誤:
1. 比較中如果有空值的話,那麼計算結果總爲NULL
2. 對空值應用邏輯操作符NOT,結果還是NULL
3. 條件控制語句中,如果條件的運算結果值爲NULL的話,與之相關的語句就不會被執行
4. 簡單CASE語句中對於空值的判斷要使用WHEN expression IS NULL
下例中,我們期待的是sequence_of_statements被執行,因爲x和y看起來就是不等的。但是,由於NULL是不確定的值,那麼,x是否等於y也就無法確定了。所以,sequence_of_statements並不會執行。
x := 5; |
同樣,下例中的sequence_of_statements也不會被執行:
a := NULL; |
· NOT操作符
讓我們再回憶一下邏輯操作符NOT,當對一個NULL值應用NOT時,結果總是NULL。因此,下面兩段內容並不相同。
IF x > y THEN |
IF NOT x > y THEN |
當IF條件值爲FALSE或NULL時,ELSE部分就會被執行。如果x和y都不爲NULL的話,兩段程序運行的效果是一樣的。但是,如果IF條件爲NULL的話,第一段是給y賦值,而第二段是給x賦值。
· 零長度字符串
PL/SQL把零長度字符串當作空值處理,這其中包括由字符函數和布爾表達式返回的值。下面的語句均是給目標變量賦空值的操作:
null_string := TO_CHAR(''); |
所以,對於檢測空字符串,要使用IS NULL操作符:
IF my_string IS NULL THEN ... |
· 連接操作符
連接操作符會忽略空值,例如表達式
'apple' || NULL || NULL || 'sauce' |
會返回
'applesauce' |
· 函數
如果給內置函數傳遞空值,一般也都會返回空值,但以下幾種情況除外。
函數DECODE將它的第一個參數和後面的一個或多個表達式相比較(表達式的值有可能爲空),如果比較的內容相匹配,就會返回後面的結果表達式。例如在下面的例子中,如果字段rating的值爲空,DECODE就會返回1000:
SELECT DECODE(rating, |
函數NVL在判斷出第一個參數是空的情況下,會返回第二個參數的值,否則直接返回第一個參數的值。使用方法如下:
start_date := NVL(hire_date, SYSDATE); |
函數REPLACE第二個參數是NULL的時候,它就會返回第一個參數的值,不管是否有第三個參數。例如,在下面例子中,結果字符串new_string的值和old_string的值完全一樣。
new_string := REPLACE(old_string, NULL, my_string); |
如果第三個參數爲空的話,REPLACE就會把第一個參數中出現的第二個參數刪除,然後返回結果。如下面這個例子:
syllabified_name := 'gold - i - locks'; |
運算的結果字符串是"goldilocks"。如果第二個和第三個參數都是NULL值,REPLACE就直接返回第一個參數。