sql >> Databasteknik >  >> RDS >> Oracle

Hur kan jag skapa ett unikt index i Oracle men ignorera nollvärden?

Vi kan göra detta med ett funktionsbaserat index. Följande använder NVL2() som, som du vet, returnerar ett värde om uttrycket inte är null och ett annat värde om det är null. Du kan använda CASE() istället.

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>

Redigera

Eftersom namnet i ditt scenario alltid kommer att fyllas i behöver du bara ett index som detta:

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

Index created.

SQL> 


  1. MySQL-anslutningen misslyckades. Kan inte ansluta till MySQL-servern på "http" (4)

  2. PHP-varning:mysqli_connect():(HY000/2002):Anslutning nekad

  3. Kör dynamisk fråga med go i sql

  4. Hur är det möjligt att SQL-fråga och ActiveRecord.find_by_sql ger olika resultat?