如何在 Postgres 中的 CASE 表达式上创建索引

Ale*_*exC 9 postgresql postgresql-9.5

我正在尝试在 CASE 表达式上创建索引,如下所示

CREATE TABLE test(i INT, j INT);

CREATE UNIQUE INDEX test_index ON test(CASE WHEN i=1 THEN j END);
Run Code Online (Sandbox Code Playgroud)

收到此错误:

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
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Postgres 9.5.2

ype*_*eᵀᴹ 19

您需要在CASE表达式周围添加额外的括号:

CREATE UNIQUE INDEX test_index 
  ON test ((CASE WHEN i=1 THEN j END)) ;
Run Code Online (Sandbox Code Playgroud)

正如文档所述CREATE INDEX

索引的键字段指定为列名,或者指定为括号中的表达式


还可以考虑使用过滤索引,这在功能上是等效的,但会使用更少的空间,因为它将j仅存储具有i = 1而不是(可能是数百万)或其余值的行的NULL值:

CREATE UNIQUE INDEX test_index_2 
  ON test (j) WHERE i=1 ;
Run Code Online (Sandbox Code Playgroud)