oracle pl/sql中判断两个两个字段相等或者不相等的时候,常常出现:字段值明明不相等(一个空,一个不空),但是判断不相等的时候就
oracle pl/sql中判断两个两个字段相等或者不相等的时候,常常出现:字段值明明不相等(一个空,一个不空),但是判断不相等的时候就是得不到true。
例如以下代码:
...
a1 varchar2(50);
a2 varchar2(50);
b1 varchar2(50);
b2 varchar2(50);
...
if ( a1 a2 or b1b2 ) 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 b1b2 ) then
2. if ( a1 = a2 and b1=b2 ) then
例如,如果a1为空,a2, b1,b2不空时,语句应该这么写
1. if ( (a1 is null and a2 is not null) or b1b2 ) 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 b1b2 ) 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;