Cara membuat indeks pada ekspresi CASE di Postgres

8

Saya mencoba membuat indeks pada ekspresi CASE, sebagai berikut

CREATE TABLE test(i INT, j INT);

CREATE UNIQUE INDEX test_index ON test(CASE WHEN i=1 THEN j END);

Mendapat kesalahan ini:

ERROR:  syntax error at or near "CASE"
LINE 1: CREATE UNIQUE INDEX test_index ON test(CASE WHEN i=1 THEN j ...
                                               ^

********** Error **********

ERROR: syntax error at or near "CASE"
SQL state: 42601
Character: 40

Apa yang saya lakukan salah?

Postgres 9.5.2

AlexC
sumber

Jawaban:

17

Anda perlu menambahkan tanda kurung tambahan di sekitar CASEekspresi:

CREATE UNIQUE INDEX test_index 
  ON test ((CASE WHEN i=1 THEN j END)) ;

Seperti yang dinyatakan dalam dokumen CREATE INDEX:

Bidang kunci untuk indeks ditentukan sebagai nama kolom, atau sebagai ekspresi yang ditulis dalam tanda kurung .


Pertimbangkan juga menggunakan indeks berfilter, yang setara dalam hal fungsionalitas tetapi akan menggunakan lebih sedikit ruang, karena akan menyimpan jnilai hanya untuk baris dengan i = 1dan bukan (mungkin jutaan) atau nilai lainnya NULL:

CREATE UNIQUE INDEX test_index_2 
  ON test (j) WHERE i=1 ;
ypercubeᵀᴹ
sumber
Saya akan memberi +1 lebih banyak untuk saran indeks yang difilter.
Colin 't Hart