Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak mogę utworzyć unikalny indeks w Oracle, ale zignorować wartości null?

Możemy to zrobić za pomocą indeksu opartego na funkcjach. Poniższe korzysta z NVL2() która, jak wiadomo, zwraca jedną wartość, jeśli wyrażenie nie jest null i inną wartość, jeśli jest null. Możesz użyć CASE() zamiast.

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>

Edytuj

Ponieważ w twoim scenariuszu nazwa zawsze będzie wypełniona, będziesz potrzebować tylko takiego indeksu:

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

Index created.

SQL> 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Odpytywanie bazy danych Windchilla za pomocą SQL

  2. ORA-28040:Brak pasującego protokołu uwierzytelniania

  3. Jak korzystać z partycji lub max?

  4. Zapytanie SQL działa w PL/SQL, ale nie w Visual Studio

  5. Wydajność Oracle JDBC w zestawie wyników