Oracle PL/SQL判斷兩個欄位相等或不等問題

dawn009發表於2014-06-11

Oracle PL/SQL中判斷兩個兩個欄位相等或者不相等的時候,常常出現:欄位值明明不相等(一個空,一個不空),但是判斷不相等的時候就是得不到TRUE。

例如以下程式碼:

...

a1  VARCHAR2(50);

a2  VARCHAR2(50);

b1  VARCHAR2(50);

b2  VARCHAR2(50);

...

IF ( a1 <> a2  OR  b1<>b2 ) THEN

   My_Modify(a2,b2);

END IF;

...

IF ( a1 = a2  AND  b1=b2 ) THEN

   --do something not useful

   a1:=a1;

ELSE

   My_Modify(a2,b2);

END IF;

 

當a1等於a2, b1不等於b2時:

經常會出現 My_Modify(a2,b2); 不執行的情況,但不知道為什麼會這樣,難道是<>符號不穩定?

2012-8-27回答:不是不穩定,而是沒有考慮欄位空值問題,詳細見後面分析。

 

2012-8-27新增說明

經過測試和分析,發現,並不是<>不穩定,而是欄位值為NULL是,不能使用=或者<>比較值,應該使用IS NULL判斷是否為空。

當欄位a1,a2,b1,b2中有一個或多個為空時,下面兩個語句都會失效:

1.    IF ( a1 <> a2  OR  b1<>b2 ) THEN

2.    IF ( a1 = a2  AND  b1=b2 ) THEN

例如,如果a1為空,a2, b1,b2不空時,語句應該這麼寫

1.   IF ( (a1 IS NULL AND  a2 IS NOT NULL) OR  b1<>b2 ) THEN

2.   IF ( (a1 IS NULL AND  a2 IS  NULL)  AND  b1=b2 ) THEN

為了解決NULL帶來的“無法判斷相等或不等”的問題,我們可以使用NVL函式解決,語句如下:

1.    IF ( NVL(a1,0)  <> NVL(a2,0)  OR  NVL(b1,0) <> NVL(b2,0) ) THEN

2.    IF ( NVL(a1,0)  =  NVL(a2,0)  AND  NVL(b1,0) = NVL(b2,0) ) THEN

 

注:NVL(args, deafultValue),args為變數,deafultValue為當args為空時,設定的預設值(一般為0)。

其中:NVL(a1, 0)  和 NVL(a1, '0')  效果樣,最後 a1 的值都是字串: '0' (不是字元!).

 

來一段測試程式碼

-- Created on 2012/8/27 
DECLEAR 
  a1  VARCHAR2(50);
  a2  VARCHAR2(50);
  b1  VARCHAR2(50);
  b2  VARCHAR2(50);
BEGIN
  a1 := 'a';
  a2 := 'a';
  b1 := 'b';
  b2 := NULL;
  
  IF ( a1 <> a2  OR  b1<>b2 ) THEN
    DBMS_OUTPUT.put_line('11111');
  END IF; 
   
  IF ( NVL(a1,0) <> NVL(a2,0) OR NVL(b1,0) <> NVL(b2,0) ) THEN
    DBMS_OUTPUT.put_line('有一對值不相等');
  END IF;
  
  IF ( NVL(a1,0) = NVL(a2,0) AND NVL(b1,0) = NVL(b2,0) ) THEN
    DBMS_OUTPUT.put_line('都相等');
  END IF;
  
  IF ( a1 = a2  AND  b1=b2 ) THEN
    DBMS_OUTPUT.put_line('22222');
  END IF; 
END;
---------&gt>轉載於:http://blog.csdn.net/zht666/article/details/7898948

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29119536/viewspace-1180462/,如需轉載,請註明出處,否則將追究法律責任。

相關文章