无法在Postgres(9.3)索引中使用concat函数

4
我正在Postgres 9.3中创建一个跨越多个文本列的索引,并且我想使用concat函数,例如:

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

然而,当我尝试这样做时,出现了以下错误:
ERROR: 索引表达式中的函数必须标记为 IMMUTABLE
使用“||”运算符进行基本连接是可行的。然而,我更喜欢使用“concat”,因为“description”可能为“NULL”,而“||”运算符似乎会将任何与“NULL”连接的内容转换为“NULL”。
如果我理解正确,这意味着“concat”未标记为不可变的,我不明白为什么。
当然,我可以用“coalesce”来处理所有可空列,但这感觉不太优雅。最重要的是,我很好奇为什么不能在我的索引中使用“concat”?

看一下 concat_ws(),它也处理 NULL 的情况。 - joop
1
推荐的方法(来自文档)是在to_tsvector()内使用coalesce()(以及使用||进行tsvector连接),例如:to_tsvector('english',coalesce(title,'')) || to_tsvector('english',coalesce(description,'')) - pozs
1个回答

9
Tom Lane在这篇文章中解释了CONCAT为什么不是IMMUTABLE

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

也就是说,这是因为它将接受非文本输入,当转换为文本时,可能会根据会话设置而更改。
您可能需要自己编写此功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接