Como criar um índice na expressão CASE no Postgres


8

Estou tentando criar um índice na expressão CASE, da seguinte maneira

CREATE TABLE test(i INT, j INT);

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

Obtendo este erro:

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

O que estou fazendo errado?

Postgres 9.5.2

Respostas:


17

Você precisa adicionar parênteses extras ao redor da CASEexpressão:

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

Como os documentos afirmam em CREATE INDEX:

Os campos-chave do índice são especificados como nomes de colunas ou, alternativamente, como expressões escritas entre parênteses .


Considere também usar um índice filtrado, que é equivalente em termos de funcionalidade, mas usaria menos espaço, pois armazenará os jvalores apenas para linhas com i = 1e não os valores (possivelmente milhões) ou o restante NULL:

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

Eu marcaria mais um com a sugestão de índice filtrado.
Colin 'Hart Hart
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.