Oracle
 sql >> база данни >  >> RDS >> Oracle

Проблем при сравнение на низове на Oracle PL/SQL

Както отбеляза Фил, празният низ се третира като 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;
 /

Относно нулевите сравнения:

Според документацията на Oracle 12c за NULLS, нулеви сравнения с помощта на IS NULL или IS NOT NULL направи оценка на TRUE или FALSE . Въпреки това, всички други сравнения се оценяват на UNKNOWN , не FALSE . В документацията се посочва още:

Условие, което се оценява на НЕИЗВЕСТНО, действа почти като FALSE. Например, оператор SELECT с условие в клаузата WHERE, което се оценява на UNKNOWN, не връща редове. Въпреки това, условие, оценявано на НЕИЗВЕСТНО, се различава от FALSE по това, че по-нататъшните операции върху оценката на НЕИЗВЕСТНО състояние ще се оценяват на НЕИЗВЕСТНО. По този начин, NOT FALSE се оценява на TRUE, но NOT 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

Освен това научих, че не трябва да пишем PL/SQL, като приемем, че празните низове винаги ще се оценяват като NULL:

Oracle Database в момента третира символна стойност с дължина нула като нула. Това обаче може да не продължи да е вярно в бъдещи издания и Oracle препоръчва да не третирате празните низове по същия начин като нулеви.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Трябва ли да изтрия или деактивирам ред в релационна база данни?

  2. Как мога да избера записи САМО от вчера?

  3. Как се изпълнява изчакването на JDBC заявка на Oracle?

  4. Съобщение за грешка в sqldeveloper:Мрежовият адаптер не можа да установи грешката при връзката

  5. Вмъкване в Oracle и извличане на генерирания ID на последователност