我在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;
答案 0 :(得分:3)
与其他数据库不同,在Oracle中,空字符串(''
)实际上与NULL
相同,因此Trim('')
也是NULL
。因此,所有三个if语句实际上都具有相同的条件。
普通比较运算符不适用于null
=
,<>
和!=
等常规比较运算符不适用于NULL
,因此它们也不适合{''
1}}。
通过不工作我的意思是,无论其他操作数如何,它们总是返回false
。与NULL
的每次比较都会产生false
,因此X = null
和X != null
都是假的。听起来像量子物理学,不是吗? :)
顺便说一下,此规则适用于所有数据库。
IS和IS不是NULL
您可以将特殊的is
和is 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'