Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle Check Constraint

Obwohl ich kein Oracle habe, habe ich einen schnellen Test mit PostgreSQL und Ihrem ersten Beispiel (IS_DISABLED NULL sein und DISABILITY_INCOME_TYPE_ID 1):

postgres=> select (null is null and 1 is null);
 ?column?
----------
 f
(1 registro)

postgres=> select (null is null and 1 is null) or (null = 0 and 1 is null);
 ?column?
----------
 f
(1 registro)

postgres=> select (null is null and 1 is null) or (null = 0 and 1 is null) or (null = 1);
 ?column?
----------

(1 registro)

Hier sehen wir deutlich, dass in diesem Fall Ihr Ausdruck (zumindest auf PostgreSQL) NULL zurückgibt. Aus dem Handbuch ,

Wenn sich Oracle also genauso verhält wie PostgreSQL, würde die Check-Einschränkung bestanden .

Um zu sehen, ob dies der Fall ist, vermeiden Sie die NULL-Spielereien, indem Sie explizit danach suchen und sehen, ob es funktioniert:

CHECK ((IS_DISABLED IS NULL AND DISABILITY_INCOME_TYPE_ID IS NULL)
    OR (IS_DISABLED IS NOT NULL AND IS_DISABLED = 0 AND DISABILITY_INCOME_TYPE_ID IS NULL)
    OR (IS_DISABLED IS NOT NULL AND IS_DISABLED = 1));