PostgresでCASE式のインデックスを作成する方法


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します。
Colin 't Hart
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.