Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Problem z porównaniem ciągów Oracle PL/SQL

Jak zauważył Phil, pusty łańcuch jest traktowany jako NULL, a NULL nie jest niczego równy ani nierówny. Jeśli oczekujesz pustych ciągów lub wartości NULL, będziesz musiał obsłużyć je za pomocą 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;
 /

Dotyczy porównań zerowych:

Zgodnie z dokumentacją Oracle 12c dotyczącą NULLS, porównania wartości null przy użyciu IS NULL lub IS NOT NULL oceniaj na TRUE lub FALSE . Jednak wszystkie inne porównania są oceniane jako UNKNOWN , nie FALSE . Dokumentacja dalej stwierdza:

Warunek, którego wynikiem jest NIEZNANE, działa prawie jak FAŁSZ. Na przykład instrukcja SELECT z warunkiem w klauzuli WHERE, której wynikiem jest UNKNOWN, nie zwraca żadnych wierszy. Jednak warunek oceniający jako NIEZNANY różni się od FAŁSZ tym, że dalsze operacje na ocenie warunku NIEZNANEGO zostaną ocenione jako NIEZNANY. Zatem NOT FALSE zwraca TRUE, ale NOT UNKNOWN zwraca UNKNOWN.

Tabela referencyjna jest dostarczana przez 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

Dowiedziałem się również, że nie powinniśmy pisać PL/SQL, zakładając, że puste ciągi zawsze będą miały wartość NULL:

Oracle Database obecnie traktuje wartość znakową o długości zero jako null. Jednak może to nie być prawdą w przyszłych wydaniach, a Oracle zaleca, aby nie traktować pustych ciągów tak samo jak wartości null.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ROWIDTONCHAR() Funkcja w Oracle

  2. lista oddzielona przecinkami w wyniku instrukcji select w Oracle

  3. Nigdy więcej SPU

  4. co to jest oracle EBS R12?

  5. SPRAWDŹ OGRANICZENIE ciągu, aby zawierał tylko cyfry. (Oracle SQL)