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)