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

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 ;

Je voudrais +1 de plus pour la suggestion d'index filtré.
Colin 't Hart
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.