जबकि मेरे पास Oracle नहीं है, मैंने PostgreSQL के साथ एक त्वरित परीक्षण किया और आपका पहला उदाहरण (IS_DISABLED
) NULL
होने के नाते और 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)
यहां हम स्पष्ट रूप से देखते हैं कि, इस मामले में, आपकी अभिव्यक्ति (कम से कम PostgreSQL पर) NULL लौटाती है। मैनुअल से ,
इसलिए, यदि Oracle PostgreSQL के समान व्यवहार करता है, तो चेक बाधा पास . होगी ।
यह देखने के लिए कि क्या यह मामला है, इसके लिए स्पष्ट रूप से जाँच करके NULL शीनिगन्स से बचें और देखें कि क्या यह काम करता है:
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));