Saltar al contenido

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

Deseamos mostrarte la mejor respuesta que hallamos en todo internet. Nuestro deseo es que te sirva de ayuda y si puedes aportar algo que nos pueda ayudar a perfeccionar nuestra información siéntete libre de hacerlo..

Solución:

Podemos hacer esto con un índice basado en funciones. Lo siguiente hace uso de NVL2() que, como saben, devuelve un valor si la expresión no es null y un valor diferente si es null. 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> 

No sé cuántas personas siguen siendo dirigidas a esta respuesta, pero al menos en la última versión de Oracle, puede tener varias filas con null en un índice único y la respuesta aceptada no es necesaria

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *