sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo puedo crear un índice único en Oracle pero ignorar los valores nulos?

Podemos hacer esto con un índice basado en funciones. Lo siguiente hace uso de NVL2() que, como sabes, devuelve un valor si la expresión no es nula y un valor diferente si es nula. Podrías usar CASE() en cambio.

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>

Editar

Debido a que en el nombre de su escenario siempre se completará, solo necesitará un índice como este:

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

Index created.

SQL>