Oracle PL/SQL判斷兩個欄位相等或不等問題
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;
--------->>轉載於:http://blog.csdn.net/zht666/article/details/7898948
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29119536/viewspace-1180462/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript 專題之如何判斷兩個物件相等JavaScript物件
- js判斷兩個物件是否相等JS物件
- JavaScript判斷兩個變數是否相等JavaScript變數
- js 判斷兩個變數是否相等JS變數
- golang中判斷兩個slice是否相等與判斷值下的 陣列是否相等Golang陣列
- JavaScript 中,如何判斷兩個物件是否相等?JavaScript物件
- sql判斷表中是否有此欄位SQL
- mysql如何判斷是否存在某個欄位MySql
- 如何判斷JavaScript中的兩變數是否相等?JavaScript變數
- sqlserver判斷欄位值是否存在某個字元SQLServer字元
- PL/SQL 插入clob欄位處理SQL
- Javascript 判斷物件是否相等JavaScript物件
- 【筆記】oracle 判斷欄位中的中文的方法筆記Oracle
- oracle中判斷欄位是否存在和新增表結構Oracle
- python如何判斷字串相等Python字串
- js判斷欄位是否為空 isNullJSNull
- SQL 判斷欄位是否以數字開頭或者包含數字SQL
- 判斷單連結串列是否存在環,判斷兩個連結串列是否相交問題詳解
- pl/sql developer的一個小問題SQLDeveloper
- MongoDB之資料查詢(欄位判斷)MongoDB
- 【質數判斷】給定兩個數,判斷這兩個數是否互質?
- pl/sql dev連線oracle相關問題SQLdevOracle
- pl/sql dev建表加欄位時建的欄位名都帶了“”SQLdev
- C----判斷兩個整數乘積幾進位制
- 判斷物件是否相等的方法,==與 isEqual物件
- 判斷陣列裡面的json 物件是否相等,相等則移除陣列JSON物件
- pl/sql的HomeEnd問題SQL
- SQL Server 自增欄位歸零等問題SQLServer
- 解決SQL Server中CHAR欄位空格問題SQLServer
- 開發:隨筆記錄之 判斷list和map相等,併合並等問題筆記
- oracle 時間欄位自動更新問題Oracle
- Java判斷欄位是否為空,為空賦值 ?Java賦值
- 【重溫基礎】18.相等性判斷
- 一道Js判斷物件是否相等面試題引發的故事JS物件面試題
- Oracle dblink比較兩個庫中的表欄位Oracle
- 儲存過程判斷若個表中是否存在某個名稱的欄位儲存過程
- MySQL 大欄位問題MySql
- PL/SQL Developer中輸入SQL語句時如何自動提示欄位SQLDeveloper