我正在创建一个 tsvector 列,并按照此处优秀的 Postgres 文档创建触发器函数:
https://www.postgresql.org/docs/9.5/textsearch-features.html#TEXTSEARCH-UPDATE-TRIGGERS
不过,我遇到了一个问题,那就是我的专栏之一是字符串数组。当我尝试设置此触发函数时,出现错误:
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON photos FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(tsv,
'pg_catalog.english',
title,
description,
array_to_string(tags, ' ')); -- this is the problematic line
这是我收到的错误:
ERROR: syntax error at or near "("
LINE 8: array_to_string(tags, ' ') );
^
SQL state: 42601
Character: 197
有没有更好的方法来传递数组?
最佳答案
我认为内置函数仅接受文本或兼容的文本数据类型。
我意识到这比使用内置的要多做很多工作,但您始终可以编写自己的触发函数,因为它可以访问整个记录(如 NEW
)。我正在对您的 table 做出一些假设。
create or replace function photos_insert_update_trigger()
returns trigger
language plpgsql as
$BODY$
BEGIN
NEW.tsv := to_tsvector ('english',
NEW.title || ' ' ||
NEW.description || ' ' ||
array_to_string (NEW.tags, ' '));
return NEW;
END;
$BODY$;
create trigger insert_update_photos_trigger
before insert or update on photos
for each row
execute procedure photos_insert_update_trigger();
insert into photos (title, description, tags)
values ('Spaceballs', 'Mel Brooks Star Wars', array['Dark Helmet', 'Yogurt']);
我不经常使用 tsvector,因此我对文本如何变成 tsvector 的解释可能有点偏差,但底线是使用您自己的触发函数,您将拥有完全的灵活性想要解决这个问题。
关于sql - 将数组传递给 Postgres 中的 tsvector 触发函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60087005/