我有以下Oracle PL / SQL代码,从你们的角度看可能会生锈:
DECLARE str1 varchar2(4000); str2 varchar2(4000); BEGIN str1:=''; str2:='sdd'; IF(str1<>str2) THEN dbms_output.put_line('The two strings is not equal'); END IF; END; /
这很明显两个字符串str1和str2不相等,但是为什么没有打印出“两个字符串不相等”呢?Oracle是否有另一种比较两个字符串的常用方法?
正如Phil所指出的,空字符串被视为NULL,并且NULL不等于或不等于任何东西。如果您期望使用空字符串或NULL,则需要使用以下命令处理它们NVL():
NVL()
DECLARE str1 varchar2(4000); str2 varchar2(4000); BEGIN str1:=''; str2:='sdd'; -- Provide an alternate null value that does not exist in your data: IF(NVL(str1,'X') != NVL(str2,'Y')) THEN dbms_output.put_line('The two strings are not equal'); END IF; END; /
关于空比较:
根据有关NULLS的Oracle 12c文档,使用IS NULL或IS NOT NULL进行空比较的结果为TRUE或FALSE。但是,所有其他比较结果为UNKNOWN, 而不是 FALSE。该文档进一步指出:
IS NULL
IS NOT NULL
TRUE
FALSE
UNKNOWN
评估为未知的条件的行为几乎类似于FALSE。例如,在WHERE子句中具有条件的SELECT语句的值等于UNKNOWN的SELECT语句不返回任何行。但是,对UNKNOWN进行条件评估与FALSE的不同之处在于,对UNKNOWN进行条件评估的进一步操作将对UNKNOWN进行评估。因此,NOT FALSE评估为TRUE,但NOT UNKNOWN评估为UNKNOWN。
Oracle提供了一个参考表:
Condition Value of A Evaluation ---------------------------------------- a IS NULL 10 FALSE a IS NOT NULL 10 TRUE a IS NULL NULL TRUE a IS NOT NULL NULL FALSE a = NULL 10 UNKNOWN a != NULL 10 UNKNOWN a = NULL NULL UNKNOWN a != NULL NULL UNKNOWN a = 10 NULL UNKNOWN a != 10 NULL UNKNOWN
我还了解到,我们不应该假设空字符串将始终评估为NULL来编写PL / SQL:
Oracle数据库当前将长度为零的字符值视为空值。但是,在将来的发行版中,情况可能不会继续如此,并且Oracle建议您不要将空字符串与null相同。