Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment puis-je créer un index unique dans Oracle mais ignorer les valeurs nulles ?

Nous pouvons le faire avec un index basé sur les fonctions. Ce qui suit utilise NVL2() qui, comme vous le savez, renvoie une valeur si l'expression n'est pas nulle et une valeur différente si elle est nulle. Vous pouvez utiliser CASE() Au lieu.

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>

Modifier

Étant donné que le nom de votre scénario sera toujours renseigné, vous n'aurez besoin que d'un index comme celui-ci :

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

Index created.

SQL>