sql >> Database teknologi >  >> RDS >> Oracle

Hvordan kan jeg oprette et unikt indeks i Oracle, men ignorere nuller?

Det kan vi gøre med et funktionsbaseret indeks. Det følgende gør brug af NVL2() der som bekendt returnerer én værdi hvis udtrykket ikke er null og en anden værdi hvis det er null. Du kan bruge CASE() i stedet.

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>

Rediger

Fordi i dit scenarie vil navn altid være udfyldt, behøver du kun et indeks som dette:

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

Index created.

SQL> 


  1. Laravel Eloquent vælg alle rækker med max created_at

  2. Udfør shell-kommandoer fra MySQL-lagrede procedure

  3. Er det fint at have flere DAO'er?

  4. Mysql:Rækkefølgen af ​​resultater med vælg <feltnavn> fra er forskellig fra rækkefølgen af ​​resultater med vælg * fra