1

我正在尝试创建以下索引;

CREATE INDEX idx_concat_paostartno_paostartsuff ON 
    dmv_os_addbase_residential (concat(pao_start_number || pao_start_suffix));

我得到了错误;

错误:索引表达式中的函数必须标记为 IMMUTABLE`

我认为这是类型的混合,就像pao_start_numbertypebigintpao_start_suffixis一样varchar。我试图解决为;

CREATE INDEX idx_concat_paostartno_paostartsuff ON  
  dmv_os_addbase_residential (concat((pao_start_number :: text) || pao_start_suffix))

但同样的错误。

我确定错误的原因是否正确,我该如何解决?我正在使用 Postgres 9.6

4

2 回答 2

4

你可能想要

CREATE INDEX idx_concat_paostartno_paostartsuff
   ON dmv_os_addbase_residential ((pao_start_number || pao_start_suffix));

该索引只能用于查询,例如

SELECT *
FROM dmv_os_addbase_residential
WHERE pao_start_number || pao_start_suffix <operator> <constant>;

, , ,或中<operator>的一个在哪里。=<<=>>=

于 2017-07-26T12:15:29.807 回答
3

Postgres 认为时区感知时间戳是可变的。所以这就是它失败的原因。我发现以下 GIST 为我解决了这个问题: https ://gist.github.com/cobusc/5875282

GIST 内容的快捷方式(感谢 cobusc):

CREATE INDEX my_index_name_idx ON my_table (date(created_ts at TIME ZONE 'UTC'));

为我工作

于 2018-04-27T17:20:09.650 回答