So erstellen Sie einen Index für den CASE-Ausdruck in Postgres

8

Ich versuche, einen Index für den CASE-Ausdruck wie folgt zu erstellen

CREATE TABLE test(i INT, j INT);

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

Diesen Fehler erhalten:

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

Was mache ich falsch?

Postgres 9.5.2

AlexC
quelle

Antworten:

17

Sie müssen dem CASEAusdruck zusätzliche Klammern hinzufügen :

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

Wie in den Dokumenten angegeben CREATE INDEX:

Die Schlüsselfelder für den Index werden als Spaltennamen oder alternativ als in Klammern geschriebene Ausdrücke angegeben .


Erwägen Sie auch die Verwendung eines gefilterten Index, der in Bezug auf die Funktionalität gleichwertig ist, jedoch weniger Speicherplatz benötigt, da die jWerte nur für Zeilen mit i = 1und nicht für die (möglicherweise Millionen) oder die restlichen NULLWerte gespeichert werden:

CREATE UNIQUE INDEX test_index_2 
  ON test (j) WHERE i=1 ;
ypercubeᵀᴹ
quelle
Ich würde +1 mehr für den gefilterten Indexvorschlag.
Colin 't Hart