Cómo crear un índice en la expresión CASE en Postgres

8

Estoy tratando de crear un índice en la expresión CASE, de la siguiente manera

CREATE TABLE test(i INT, j INT);

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

Obteniendo este error:

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é estoy haciendo mal?

Postgres 9.5.2

AlexC
fuente

Respuestas:

17

Debe agregar paréntesis adicionales alrededor de la CASEexpresión:

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

Como dicen los documentos en CREATE INDEX:

Los campos clave para el índice se especifican como nombres de columna, o alternativamente como expresiones escritas entre paréntesis .


Considere también usar un índice filtrado, que es equivalente en términos de funcionalidad pero usaría menos espacio, ya que almacenará los jvalores solo para filas con i = 1y no los (posiblemente millones) o los NULLvalores restantes :

CREATE UNIQUE INDEX test_index_2 
  ON test (j) WHERE i=1 ;
ypercubeᵀᴹ
fuente
Me gustaría +1 más por la sugerencia de índice filtrado.
Colin 't Hart