Welcome 微信登录

首页 / 数据库 / MySQL / 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 ) THEN2.    IF ( a1 = a2  AND  b1=b2 ) THEN例如,如果a1为空,a2, b1,b2不空时,语句应该这么写1. IF ( (a1 IS NULL AND  a2 IS NOT NULL) OR  b1<>b2 ) THEN2. 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) ) THEN2.    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("有一对值不相等 来自 http://www.linuxidc.com  ");
  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相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12针对Oracle用户的Linux高级命令详解之资源管理篇Oracle中关于并集/交集/差集的运算相关资讯      PL/SQL 
  • PL/SQL之存储过程和函数  (今 14:09)
  • PL/SQL Developer连接本地Oracle   (07月27日)
  • 【PL/SQL系列】Oracle存储过程使用  (04月23日)
  • PL/SQL Developer 使用技巧分享  (09月16日)
  • PL/SQL实现Java中的split()方法的  (07月10日)
  • 从一个案例看PL/SQL代码片的编译与  (03月04日)
本文评论 查看全部评论 (0)
表情: 姓名: 字数