PL/SQL空值處理(轉載)

在使用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;
y    := 
NULL;
...
IF x != y THEN   -- yields NULL, not TRUE
  sequence_of_statements; 
-- not executed
END IF;

同樣,下例中的sequence_of_statements也不會被執行:

a    := NULL;
b    := 
NULL;
...
IF a = b THEN   -- yields NULL, not TRUE
  sequence_of_statements; 
-- not executed
END IF;

·    NOT操作符

讓我們再回憶一下邏輯操作符NOT,當對一個NULL值應用NOT時,結果總是NULL。因此,下面兩段內容並不相同。

IF x > y THEN
  high    := x;
ELSE
  high    := y;
END IF;

IF NOT x > y THEN
  high    := y;
ELSE
  high    := x;
END IF;

當IF條件值爲FALSE或NULL時,ELSE部分就會被執行。如果x和y都不爲NULL的話,兩段程序運行的效果是一樣的。但是,如果IF條件爲NULL的話,第一段是給y賦值,而第二段是給x賦值。

·    零長度字符串

PL/SQL把零長度字符串當作空值處理,這其中包括由字符函數和布爾表達式返回的值。下面的語句均是給目標變量賦空值的操作:

null_string    := TO_CHAR('');
zip_code       := SUBSTR(address, 25, 0);
valid          :=(NAME != '');

所以,對於檢測空字符串,要使用IS NULL操作符:

IF my_string IS NULL THEN ...

·    連接操作符

連接操作符會忽略空值,例如表達式

'apple' || NULL || NULL || 'sauce'

會返回

'applesauce'

·    函數

如果給內置函數傳遞空值,一般也都會返回空值,但以下幾種情況除外。

函數DECODE將它的第一個參數和後面的一個或多個表達式相比較(表達式的值有可能爲空),如果比較的內容相匹配,就會返回後面的結果表達式。例如在下面的例子中,如果字段rating的值爲空,DECODE就會返回1000:

SELECT DECODE(rating,
             
 NULL, 1000,
              
'C', 2000,
              
'B', 4000,
              
'A', 5000
             )
  
INTO credit_limit
  
FROM accts
 
WHERE acctno = my_acctno;

函數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';
  NA
ME                := REPLACE(syllabified_name,
                                 
' - ',
                                 
NULL
                                );

運算的結果字符串是"goldilocks"。如果第二個和第三個參數都是NULL值,REPLACE就直接返回第一個參數。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章