如何在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

我究竟做错了什么?

PostgreSQL 9.5.2

Answers:


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.