Oracle
 sql >> база данни >  >> RDS >> Oracle

Как мога да създам уникален индекс в Oracle, но да игнорирам нули?

Можем да направим това с функционален индекс. Следното използва NVL2() който, както знаете, връща една стойност, ако изразът не е нула, и различна стойност, ако е нула. Можете да използвате CASE() вместо.

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>

Редактиране

Тъй като във вашия сценарий името винаги ще бъде попълнено, ще ви трябва само индекс като този:

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. PL/SQL Курсор за цикъл

  2. Как да създадете GROUP BY на минимална и максимална дата

  3. Има ли начин да се създаде автоматично увеличаващ се първичен ключ на Guid в база данни на Oracle?

  4. Сравняване с дата в Oracle sql

  5. Използване на SELECT UNION и връщане на изход от две колони от една таблица