基于传递给PostgreSQL函数的列名数组获取行值
我正在尝试在PostgreSQL 9.2中设置全文搜索。我创建了一个新表来保存我要搜索的内容(这样我就可以跨许多不同类型的项目进行搜索),如下所示:基于传递给PostgreSQL函数的列名数组获取行值,postgresql,Postgresql,我正在尝试在PostgreSQL 9.2中设置全文搜索。我创建了一个新表来保存我要搜索的内容(这样我就可以跨许多不同类型的项目进行搜索),如下所示: CREATE TABLE search ( target_id bigint PRIMARY KEY, target_type text, fts tsvector ); CREATE INDEX search_fts ON search USING gin(fts); 每当一个新项目插入(或更新)到我要搜索的各个表中时
CREATE TABLE search (
target_id bigint PRIMARY KEY,
target_type text,
fts tsvector
);
CREATE INDEX search_fts ON search USING gin(fts);
每当一个新项目插入(或更新)到我要搜索的各个表中时,它应该自动添加到搜索
表中。假设我的表如下所示:
CREATE TABLE item (id bigint PRIMARY KEY, name text NOT NULL, description text);
我创建了一个触发器,用于传入我希望能够搜索的列名:
CREATE TRIGGER insert_item_search BEFORE INSERT
ON item FOR EACH ROW EXECUTE PROCEDURE
insert_search('{name, description}'::text[]);
然后创建了一个新函数insert\u search
,如下所示:
CREATE OR REPLACE FUNCTION insert_search(cols text[]) RETURNS TRIGGER AS $$
BEGIN
INSERT INTO search (target_id, target_type, fts) VALUES (
NEW.id, TG_TABLE_NAME, to_tsvector('english', 'foo')
);
RETURN NEW;
END;
$$ LANGUAGE PLPGSQL;
我的问题是,如何将基于
cols
的表值传递到totsvector
?现在,函数正在被调用并正确插入id
和type
,但我不知道基于cols
参数动态获取其他值的正确方法。您可以使用TG\u ARGV
变量访问触发器定义中指定的参数。你可以找到关于这个的文档TG_ARGV
是一个由基于0的索引访问的数组。因此它可能类似于TG_ARGV[0]
,TG_ARGV[1]
,等等。您可以使用TG_ARGV
变量访问触发器定义中指定的参数。你可以找到关于这个的文档TG_ARGV
是一个由基于0的索引访问的数组。因此它可能类似于TG\u ARGV[0]
,TG\u ARGV[1]
,等等。首先,要传递参数,只需直接发送它们:
CREATE TRIGGER insert_item_search BEFORE INSERT
ON item FOR EACH ROW EXECUTE PROCEDURE
insert_search('name', 'description');
从PL/pgSQL中,您将以数组的形式获得这些参数,称为TG\u ARGV
。但是,问题是PL/pgSQL无法根据名称从NEW
记录中获取值。要做到这一点,您可以使用允许这样做的语言(如PL/python或PL/perl)或使用
我会坚持使用最后一种语言并使用hstore
(除非您已经使用其他语言之一来创建函数):
正如您在上面看到的,我使用了
hstore
的操作符->
来获取基于名称的值(在TG_ARGV[I]
)。首先,要传递参数,只需直接发送它们:
CREATE TRIGGER insert_item_search BEFORE INSERT
ON item FOR EACH ROW EXECUTE PROCEDURE
insert_search('name', 'description');
从PL/pgSQL中,您将以数组的形式获得这些参数,称为TG\u ARGV
。但是,问题是PL/pgSQL无法根据名称从NEW
记录中获取值。要做到这一点,您可以使用允许这样做的语言(如PL/python或PL/perl)或使用
我会坚持使用最后一种语言并使用hstore
(除非您已经使用其他语言之一来创建函数):
正如您在上面看到的,我使用了
hstore
的操作符->
来获取基于名称的值(在TG\u ARGV[I]
)。谢谢!我首先创建了tsvector,然后插入到搜索表中(因为循环中的INSERT打破了主键约束),但这让我在大部分过程中都做到了。@比尔,当你传递两个参数时,我认为你需要插入多个寄存器。。。但你可以随心所欲地适应,我很高兴它奏效了…谢谢!我首先创建了tsvector,然后插入到搜索表中(因为循环中的INSERT打破了主键约束),但这让我在大部分过程中都做到了。@比尔,当你传递两个参数时,我认为你需要插入多个寄存器。。。但你可以随心所欲地适应,我很高兴它奏效了。。。