我正在Postgres 9.3中创建一个跨越多个文本列的索引,并且我想使用
然而,当我尝试这样做时,出现了以下错误:
ERROR: 索引表达式中的函数必须标记为 IMMUTABLE
使用“||”运算符进行基本连接是可行的。然而,我更喜欢使用“concat”,因为“description”可能为“NULL”,而“||”运算符似乎会将任何与“NULL”连接的内容转换为“NULL”。
如果我理解正确,这意味着“concat”未标记为不可变的,我不明白为什么。
当然,我可以用“coalesce”来处理所有可空列,但这感觉不太优雅。最重要的是,我很好奇为什么不能在我的索引中使用“concat”?
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 的情况。 - joopto_tsvector()
内使用coalesce()
(以及使用||
进行tsvector连接),例如:to_tsvector('english',coalesce(title,'')) || to_tsvector('english',coalesce(description,''))
。 - pozs