Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于传递给PostgreSQL函数的列名数组获取行值_Postgresql - Fatal编程技术网

基于传递给PostgreSQL函数的列名数组获取行值

基于传递给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); 每当一个新项目插入(或更新)到我要搜索的各个表中时

我正在尝试在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 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打破了主键约束),但这让我在大部分过程中都做到了。@比尔,当你传递两个参数时,我认为你需要插入多个寄存器。。。但你可以随心所欲地适应,我很高兴它奏效了。。。