sql - 将数组传递给 Postgres 中的 tsvector 触发函数

标签 sql database postgresql full-text-search

我正在创建一个 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/

相关文章:

mysql 获取元数据信息——用户创建、用户查询、用户组和数据库大小

php - 将包含 case 语句的 MySql 查询转换为 codeigniter 事件记录查询

postgresql - 锁定当前正在插入的行以避免在读取相同行时发生竞争情况

sql - Access SQL中如何实现 "INSERT INTO"

c# - Linq 的 Column In (Select ...) 语句

java - 如何从 servlet 连接到数据库。我试过下面的代码,但控制每次都异常

javascript - _.extend 忽略 MEAN Stack 中的属性

sql - 如何在 SQL 中四舍五入

postgresql - 当我尝试在 PostgreSQL 中创建桥接表时出现错误

nhibernate - 流利的 NHibernate 和 PostgreSQL,SchemaMetadataUpdater.QuoteTableAndColumns - System.NotSupportedException : Specified method is not supported