不能在Postgres(9.3)索引中使用concat函数

时间:2016-01-05 09:43:14

标签: sql postgresql indexing concat

我正在几个文本列上创建索引(在Postgres 9.3中),我想使用concat,例如:

CREATE INDEX 
ON my_table
USING gin (to_tsvector('english', concat(title, ' ', description)))

然而,当我尝试这样做时,我收到以下错误:

ERROR: functions in index expression must be marked IMMUTABLE

||运算符的Vanilla串联工作正常。但是,我更倾向于使用concat,因为description可能是NULL||运算符似乎将NULL的任何连接转换为NULL }}

如果我理解正确,这意味着concat未标记为不可变,我不明白。

当然,我只能coalesce所有可以为空的列,但感觉不够优雅。最重要的是,我很好奇为什么我不能在我的索引中使用concat

1 个答案:

答案 0 :(得分:7)

汤姆·莱恩在this post中解释了CONCAT不是IMMUTABLE的原因:

  

concat()调用数据类型输出函数,这些函数不一定   不可改变的。一个简单的例子是timestamptz_out的结果取决于   在TimeZone设置上。

即。这是因为它会接受非文本输入,这可能会在转换为文本时根据会话设置而改变。

你可能不得不为此推出自己的功能。