我正在几个文本列上创建索引(在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
与||
操作员的香草连接工作正常.但是,我宁愿使用,concat
因为description
可能是NULL
,并且||
运算符似乎将任何串联NULL
转换为NULL
.
如果我理解正确,这意味着concat
没有标记为不可变,我不明白.
当然,我可以只使用coalesce
所有可以为空的列,但感觉不够优雅.最重要的是,我很好奇为什么我不能concat
在我的索引中使用?
原因CONCAT
不是IMMUTABLE
Tom Lane在这篇文章中解释的:
concat()调用数据类型输出函数,这些函数不一定是不可变的.一个简单的例子是timestamptz_out的结果取决于TimeZone设置.
也就是说,这是因为它将接受非文本输入,这可能会在转换为文本时根据会话设置而改变.
你可能不得不为此推出自己的功能.