Meskipun saya tidak memiliki Oracle, saya melakukan tes cepat dengan PostgreSQL dan contoh pertama Anda (IS_DISABLED
menjadi NULL
dan DISABILITY_INCOME_TYPE_ID
menjadi 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)
Di sini kita melihat dengan jelas bahwa, dalam hal ini, ekspresi Anda (setidaknya pada PostgreSQL) mengembalikan NULL. Dari manual ,
Jadi, jika Oracle berperilaku sama dengan PostgreSQL, batasan pemeriksaan akan lulus .
Untuk melihat apakah ini masalahnya, hindari kejahatan NULL dengan memeriksanya secara eksplisit dan lihat apakah itu berhasil:
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));