sql >> Database >  >> RDS >> Oracle

Vergelijkingsprobleem met Oracle PL/SQL-tekenreeksen

Zoals Phil opmerkte, wordt de lege tekenreeks behandeld als een NULL en is NULL nergens gelijk aan of ongelijk aan. Als je lege strings of NULL's verwacht, moet je die afhandelen met 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;
 /

Over nulvergelijkingen:

Volgens de Oracle 12c-documentatie over NULLS, nulvergelijkingen met behulp van IS NULL of IS NOT NULL evalueer tot TRUE of FALSE . Alle andere vergelijkingen zijn echter UNKNOWN , niet FALSE . De documentatie vermeldt verder:

Een voorwaarde die evalueert tot ONBEKEND, gedraagt ​​zich bijna als ONWAAR. Een SELECT-instructie met een voorwaarde in de WHERE-component die resulteert in UNKNOWN, retourneert bijvoorbeeld geen rijen. Een voorwaarde die wordt geëvalueerd tot ONBEKEND verschilt van FALSE in die zin dat verdere bewerkingen op een ONBEKENDE voorwaarde evaluatie tot ONBEKEND zullen worden beoordeeld. Dus NOT FALSE resulteert in TRUE, maar NOT UNKNOWN resulteert in UNKNOWN.

Oracle levert een referentietabel:

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

Ik heb ook geleerd dat we geen PL/SQL moeten schrijven in de veronderstelling dat lege strings altijd als NULL zullen worden geëvalueerd:

Oracle Database behandelt momenteel een tekenwaarde met een lengte van nul als null. In toekomstige releases kan dit echter niet zo blijven en Oracle raadt aan om lege strings niet op dezelfde manier te behandelen als nulls.



  1. Hoe wijzig ik de opmaak voor mijn retourwaarden in deze functie?

  2. Hoe koppel ik een hele dag aan een datetime-veld?

  3. Een overzicht van Amazon RDS &Aurora-aanbiedingen voor PostgreSQL

  4. Verouderde functies om uit uw gereedschapskist te halen - Deel 3