sql >> Databáze >  >> RDS >> Oracle

Problém s porovnáním řetězců Oracle PL/SQL

Jak poznamenal Phil, s prázdným řetězcem se zachází jako s NULL a NULL se ničemu nerovná ani nerovná. Pokud očekáváte prázdné řetězce nebo hodnoty NULL, budete je muset zpracovat 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;
 /

Pokud jde o nulová srovnání:

Podle dokumentace Oracle 12c o NULLS, null porovnání pomocí IS NULL nebo IS NOT NULL vyhodnotit jako TRUE nebo FALSE . Všechna ostatní srovnání se však vyhodnotí jako UNKNOWN , ne FALSE . V dokumentaci se dále uvádí:

Podmínka, která se vyhodnotí jako NEZNÁMÁ, působí téměř jako NEPRAVDA. Například příkaz SELECT s podmínkou v klauzuli WHERE, která se vyhodnotí jako UNKNOWN, nevrátí žádné řádky. Podmínka vyhodnocená jako NEZNÁMÁ se však liší od NEPRAVDA v tom, že další operace s vyhodnocením NEZNÁMÉ podmínky se vyhodnotí jako NEZNÁMÁ. Tedy NOT FALSE se vyhodnotí jako TRUE, ale NOT UNKNOWN se vyhodnotí jako UNKNOWN.

Referenční tabulku poskytuje 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

Také jsem se dozvěděl, že bychom neměli psát PL/SQL za předpokladu, že prázdné řetězce budou vždy vyhodnoceny jako NULL:

Oracle Database aktuálně považuje znakovou hodnotu s délkou nula za hodnotu null. To však nemusí platit v budoucích verzích a Oracle doporučuje, abyste s prázdnými řetězci nezacházeli stejně jako s hodnotami null.



  1. Zpráva o databázi Open Source za rok 2019:Nejlepší databáze, veřejný cloud vs. On-Premise, Polyglot Persistence

  2. MySQL - UPDATE více řádků s různými hodnotami v jednom dotazu

  3. Vytvořte vypočítaný sloupec, který používá data z jiné tabulky na serveru SQL Server

  4. Vypočítejte MD5 hash řetězce UTF8