Mặc dù tôi không có Oracle, nhưng tôi đã thực hiện một bài kiểm tra nhanh với PostgreSQL và ví dụ đầu tiên của bạn (IS_DISABLED
là NULL
và DISABILITY_INCOME_TYPE_ID
là 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)
Ở đây chúng ta thấy rõ ràng rằng, trong trường hợp này, biểu thức của bạn (ít nhất là trên PostgreSQL) trả về NULL. Từ hướng dẫn ,
Vì vậy, nếu Oracle hoạt động giống như PostgreSQL, thì ràng buộc kiểm tra sẽ vượt qua .
Để xem có đúng như vậy không, hãy tránh những trò tai quái NULL bằng cách nhanh chóng kiểm tra nó và xem nó có hoạt động không:
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));