Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana saya bisa membuat indeks unik di Oracle tetapi mengabaikan nol?

Kita dapat melakukan ini dengan indeks berbasis fungsi. Berikut ini menggunakan NVL2() yang, seperti yang Anda ketahui, mengembalikan satu nilai jika ekspresinya bukan nol dan nilai yang berbeda jika itu nol. Anda dapat menggunakan CASE() alih-alih.

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>

Sunting

Karena dalam skenario nama Anda akan selalu diisi, Anda hanya memerlukan indeks seperti ini:

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. Kelompokkan menurut untuk membuat perpaduan vertikal

  2. Oracle mendapatkan semua tanggal dalam sebulan

  3. SQL:Setelah bergabung dengan tabel, fungsi SUM() mengembalikan nilai yang salah

  4. Kebuntuan di Oracle

  5. Mengapa saya mendapatkan ORA-01401:nilai yang dimasukkan terlalu besar untuk kolom - ketika saya tidak memasukkan?