一尘不染

Oracle PL / SQL字符串比较问题

sql

我有以下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是否有另一种比较两个字符串的常用方法?


阅读 244

收藏
2021-03-17

共1个答案

一尘不染

正如Phil所指出的,空字符串被视为NULL,并且NULL不等于或不等于任何东西。如果您期望使用空字符串或NULL,则需要使用以下命令处理它们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;
 /

关于空比较:

根据有关NULLSOracle
12c文档
,使用IS NULLIS NOT NULL进行空比较的结果为TRUEFALSE。但是,所有其他比较结果为UNKNOWN而不是
FALSE。该文档进一步指出:

评估为未知的条件的行为几乎类似于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相同。

2021-03-17