oracle sql判断相等,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
總結
以上是生活随笔為你收集整理的oracle sql判断相等,Oracle PL/SQL判断两个字段相等或不等问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: udp模拟tcp java_Java简单
- 下一篇: oracle恢复库覆盖原来的库,orac