我们可以使用基于函数的索引来做到这一点。
NVL2()如您所知,以下内容将利用其中的一个:如果表达式不为null,则返回一个值;如果表达式为null,则返回另一个值。您可以
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, 'apc@example.com') 2 /1 row created.SQL> insert into blah values (null, 'apc@example.com') 2 /1 row created.SQL> insert into blah values ('APC', 'apc@example.com') 2 /1 row created.SQL> insert into blah values ('APC', 'apc@example.com') 2 /insert into blah values ('APC', 'apc@example.com')*ERROR at line 1:ORA-00001: unique constraint (APC.BLAH_UIDX) violatedSQL>编辑
因为将始终填充您的方案名称,所以您只需要这样的索引:
SQL> create unique index blah_uidx on blah 2 (nvl2(email, name, null), email) 3 /Index created.SQL>



