Kita dapat melakukan ini dengan indeks berbasis fungsi. Berikut ini menggunakan NVL2()
yang, seperti yang Anda ketahui, mengembalikan satu nilai jika ekspresinya bukan nol dan nilai yang berbeda jika itu nol. Anda dapat menggunakan CASE()
alih-alih.
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>
Sunting
Karena dalam skenario nama Anda akan selalu diisi, Anda hanya memerlukan indeks seperti ini:
SQL> create unique index blah_uidx on blah
2 (nvl2(email, name, null), email)
3 /
Index created.
SQL>