PL / SQL关系运算符<> ,!=语法问题

时间:2014-08-07 06:51:01

标签: sql database oracle syntax

我在pl / sql程序中尝试下面的代码。  我没有让我的代码在以下任何条件下运行,它只是跳过所有'如果'条件。

代码快照:---

IF(null != 'C') THEN 
       DBMS_OUTPUT.put_line ('1');
 END IF;

 IF(Trim('') <> 'C') THEN 
       DBMS_OUTPUT.put_line ('2');
 END IF;

 IF(Trim('') != 'C') THEN 
       DBMS_OUTPUT.put_line ('3');
 END IF;

3 个答案:

答案 0 :(得分:3)

与其他数据库不同,在Oracle中,空字符串('')实际上与NULL相同,因此Trim('')也是NULL。因此,所有三个if语句实际上都具有相同的条件。

普通比较运算符不适用于null

=<>!=等常规比较运算符不适用于NULL,因此它们也不适合{'' 1}}。 通过不工作我的意思是,无论其他操作数如何,它们总是返回false。与NULL的每次比较都会产生false,因此X = nullX != null都是假的。听起来像量子物理学,不是吗? :) 顺便说一下,此规则适用于所有数据库。

IS和IS不是NULL

您可以将特殊的isis not运算符用于null,因此以下两个ifs在语义上是相同的(在Oracle中):

if C is not null then

if C is not '' then

但是这个错了:

if C != '' then

因为它实际上意味着以下内容,并且始终返回false:

if C != null then

大多数字符串函数也为NULL输入返回NULL

这可能会造成很大的麻烦,因为即使length('')返回null而不是0:很容易在那里犯错误。

select length('') from dual -- Returns NULL

特别棘手,因为一个正常的&#39;与0比较返回false。所以以下(意外)工作

select 
  case when length(StringField) > 0 then
    'string is not empty'
  else
    'string is empty'
  end
from dual

但是这个没有:

select 
  case when length(StringField) = 0 then
    'string is empty'
  else
    'string is not empty'
  end
from dual

答案 1 :(得分:0)

在Oracle中,NULL无法与值进行比较 因此你可以使用函数NVL(x,y),其中如果x有值,函数返回x,如果x为null,则返回y

IF (NVL(NULL,'D') != 'C')
THEN
DBMS_OUTPUT.put_line ('1');
END IF;

IF(NVL(Trim(''),'D') <> 'C') THEN 
   DBMS_OUTPUT.put_line ('2');
END IF;

IF(NVL(Trim(''),'D') != 'C') THEN 
   DBMS_OUTPUT.put_line ('3');
END IF;

答案 2 :(得分:0)

对我来说,你问题中的每一个条件都与:

相同
IF('C' is not null) THEN  
       DBMS_OUTPUT.put_line ('1');
 END IF;

这是将您的值与NULL

进行比较的正确方法

Trim('')表示null,因此这个条件不正确

Trim('') <> 'C'
Trim('') != 'C'

这个也不正确

null != 'C'