Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie kann ich einen eindeutigen Index in Oracle erstellen, aber Nullen ignorieren?

Wir können dies mit einem funktionsbasierten Index tun. Im Folgenden wird NVL2() verwendet die, wie Sie wissen, einen Wert zurückgibt, wenn der Ausdruck nicht null ist, und einen anderen Wert, wenn er null ist. Sie könnten CASE() verwenden stattdessen.

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>

Bearbeiten

Da in Ihrem Szenario der Name immer ausgefüllt wird, benötigen Sie nur einen Index wie diesen:

SQL> create unique index blah_uidx on blah
  2      (nvl2(email, name, null), email)
  3  /

Index created.

SQL>