Как создать индекс по выражению CASE в Postgres


8

Я пытаюсь создать индекс по выражению CASE следующим образом

CREATE TABLE test(i INT, j INT);

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

Получение этой ошибки:

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

Что я делаю неправильно?

Postgres 9.5.2

Ответы:


17

Вам нужно добавить дополнительные скобки вокруг CASEвыражения:

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

Как указано в документах CREATE INDEX:

Ключевые поля для индекса указываются как имена столбцов или, альтернативно, как выражения, записанные в скобках .


Также рассмотрите возможность использования отфильтрованного индекса, который эквивалентен с точки зрения функциональности, но будет использовать меньше места, поскольку он будет хранить jзначения только для строк, i = 1а не (возможно, миллионы) или остальных NULLзначений:

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

Я бы еще +1 за предложение отфильтрованного индекса.
Колин т Харт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.