Come creare un indice sull'espressione CASE in Postgres


8

Sto cercando di creare un indice sull'espressione CASE, come segue

CREATE TABLE test(i INT, j INT);

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

Ottenere questo errore:

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

Che cosa sto facendo di sbagliato?

Postgres 9.5.2

Risposte:


17

Devi aggiungere parentesi extra attorno CASEall'espressione:

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

Come affermano i documenti in CREATE INDEX:

I campi chiave dell'indice sono specificati come nomi di colonna o, in alternativa, come espressioni scritte tra parentesi .


Prendi in considerazione anche l'uso di un indice filtrato, che è equivalente in termini di funzionalità ma utilizzerebbe meno spazio, poiché memorizzerà i jvalori solo per le righe con i = 1e non i NULLvalori (possibilmente milioni) o rimanenti :

CREATE UNIQUE INDEX test_index_2 
  ON test (j) WHERE i=1 ;

Farei +1 in più per il suggerimento sull'indice filtrato.
Colin 't Hart,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.