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;

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Oracle PL/SQLOracle数据库的编程语言,它允许开发人员编写存储过程、触发器、函数和包等数据库对象,以实现更高效、安全和可靠的应用程序。以下是一些Oracle PL/SQL必知必会的知识点: 1. PL/SQL基础语法:包括变量定义、控制结构、循环语句、异常处理等。 2. 存储过程:存储过程是一组SQL语句的集合,可以在其中定义变量、使用控制结构、调用其他存储过程等。 3. 触发器:触发器是一种特殊的存储过程,它会在数据库表上的特定事件发生时自动执行一些操作。 4. 函数:函数是一种可以接受输入参数并返回结果的代码块,它可以用于处理数据、计算等操作。 5. 包:包是一种可以封装存储过程、函数和变量的方式,它可以提供更好的代码管理和组织。 6. 游标:游标是一种可以遍历查询结果集的机制,它可以用于在PL/SQL中处理大量数据。 7. 动态SQL:动态SQL是一种可以在运行时构建和执行SQL语句的机制,它可以提供更大的灵活性和自由度。 8. 性能优化:在编写PL/SQL代码时需要注意性能问题,如尽量避免使用循环、减少数据库访问次数等。 9. 安全性:在编写PL/SQL代码时需要注意安全问题,如避免SQL注入攻击、对敏感数据进行加密等。 以上是Oracle PL/SQL必知必会的一些知识点,掌握它们可以帮助开发人员更好地使用Oracle数据库进行应用程序开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值