Comment créer un index sur l'expression CASE dans Postgres

8

J'essaie de créer un index sur l'expression CASE, comme suit

CREATE TABLE test(i INT, j INT);

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

Obtenir cette erreur:

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

Qu'est-ce que je fais mal?

Postgres 9.5.2

AlexC
la source

Réponses:

17

Vous devez ajouter des parenthèses supplémentaires autour de l' CASEexpression:

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

Comme l'indiquent les documents CREATE INDEX:

Le ou les champs clés de l'index sont spécifiés sous forme de noms de colonne ou sous forme d' expressions écrites entre parenthèses .


Pensez également à utiliser un index filtré, qui est équivalent en termes de fonctionnalités mais utiliserait moins d'espace, car il stockera les jvaleurs uniquement pour les lignes avec i = 1et non les (éventuellement des millions) ou les NULLvaleurs restantes :

CREATE UNIQUE INDEX test_index_2 
  ON test (j) WHERE i=1 ;
ypercubeᵀᴹ
la source
Je voudrais +1 de plus pour la suggestion d'index filtré.
Colin 't Hart