Heim >Datenbank >MySQL-Tutorial >Oracle PL/SQL比较两个字段是否一样

Oracle PL/SQL比较两个字段是否一样

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-07 17:26:231722Durchsuche

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;

linux

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn