Oracle PL/SQL判断两个字段相等或不等问题
2012-08-23 11:09
429 查看
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;
例如以下代码:
...
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;
相关文章推荐
- Oracle PL/SQL判断两个字段相等或不等问题
- Oracle PL/SQL比较两个字段是否一样
- PL/SQL 怎么判断两个结果集是否相等
- oracle 定长字段查询问题 ,ibatis 与pl/sql查询的char类型字段查询不同
- oracle 定长字段查询问题 ,ibatis 与pl/sql查询的char类型字段查询不同
- oracle 定长字段查询问题 ,ibatis 与pl/sql查询的char类型字段查询不同
- 数据库_ PL/SQL 怎么判断两个结果集是否相等
- Oracle基础知识:在PL/SQL中修改ORACLE的字段顺序
- LINUX的ORACLE 中实现PL/SQL读写文件 问题解决方法
- 关于Oracle 的定时执行作业问题(动态PL/SQL)
- PL/SQL DEV和TOAD等工具访问本机64位oracle的问题
- [oracle] 解决X64操作系统PL/SQL连接报错问题 make sure you have the 32 bits oracle client installed
- PL/SQL developer连接oracle出现“ORA-12154:TNS:could not resolve the connect identifier specified”问题的解决
- 多语种开发项目使用oracle+PL/SQL Developer的韩文插入问题
- sql语句问题 通过联立两个表更新其中一个表的字段
- Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 wher
- java中判断两个字符串是否相等的问题
- 解决X64操作系统PL/SQL连接报错问题 make sure you have the 32 bits oracle client installed
- 解决X64操作系统PL/SQL连接报错问题 make sure you have the 32 bits oracle client installed
- ORACLE PL/SQL Developer工具执行计划无COST和cardinality,bytes等列值显示问题