हम इसे फ़ंक्शन-आधारित अनुक्रमणिका के साथ कर सकते हैं। निम्नलिखित NVL2()
का उपयोग करता है जो, जैसा कि आप जानते हैं, एक मान देता है यदि व्यंजक शून्य नहीं है और एक भिन्न मान यदि यह शून्य है। आप CASE()
. का उपयोग कर सकते हैं बजाय।
SQL> create table blah (name varchar2(10), email varchar2(20))
2 /
Table created.
SQL> create unique index blah_uidx on blah
2 (nvl2(email, name, null), nvl2(name, email, null))
3 /
Index created.
SQL> insert into blah values ('APC', null)
2 /
1 row created.
SQL> insert into blah values ('APC', null)
2 /
1 row created.
SQL> insert into blah values (null, '[email protected]')
2 /
1 row created.
SQL> insert into blah values (null, '[email protected]')
2 /
1 row created.
SQL> insert into blah values ('APC', '[email protected]')
2 /
1 row created.
SQL> insert into blah values ('APC', '[email protected]')
2 /
insert into blah values ('APC', '[email protected]')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.BLAH_UIDX) violated
SQL>
संपादित करें
क्योंकि आपके परिदृश्य में नाम हमेशा भरा रहेगा, आपको केवल इस तरह की एक अनुक्रमणिका की आवश्यकता होगी:
SQL> create unique index blah_uidx on blah
2 (nvl2(email, name, null), email)
3 /
Index created.
SQL>