sql >> Databasteknik >  >> RDS >> Oracle

Oracle PL/SQL-strängjämförelseproblem

Som Phil noterade behandlas den tomma strängen som en NULL, och NULL är inte lika med eller ojämlikt med någonting. Om du förväntar dig tomma strängar eller NULLs måste du hantera de med 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;
 /

Angående nolljämförelser:

Enligt Oracle 12c-dokumentationen om NULLS, nolljämförelser med IS NULL eller IS NOT NULL utvärdera till TRUE eller FALSE . Men alla andra jämförelser utvärderas till UNKNOWN , inte FALSE . I dokumentationen står det vidare:

Ett tillstånd som utvärderas till OKÄNT fungerar nästan som FALSK. Till exempel returnerar en SELECT-sats med ett villkor i WHERE-satsen som utvärderas till UNKNOWN inga rader. Ett tillstånd som utvärderas till OKÄNT skiljer sig dock från FALSK genom att ytterligare operationer på en OKÄNT tillståndsutvärdering kommer att utvärderas till OKÄNT. Alltså, NOT FALSE utvärderas till TRUE, men NOT ONKNOWN utvärderas till OKÄNT.

En referenstabell tillhandahålls av 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

Jag lärde mig också att vi inte ska skriva PL/SQL förutsatt att tomma strängar alltid kommer att utvärderas som NULL:

Oracle Database behandlar för närvarande ett teckenvärde med längden noll som noll. Detta kanske dock inte fortsätter att vara sant i framtida utgåvor, och Oracle rekommenderar att du inte behandlar tomma strängar på samma sätt som nollor.



  1. Hur man använder SQL Server HierarchyID genom enkla exempel

  2. Spring Batch ORA-08177:kan inte serialisera åtkomst för denna transaktion vid körning av enstaka jobb, SERIALISERAD isoleringsnivå

  3. PDOException SQLSTATE[HY000] [2002] Ingen sådan fil eller katalog

  4. Ansluter RStudio till SQL Server