在PL / pgSQL过程中将jsonb_array_elements的多行结果扩展到tsvector [英] Expand multiple rows result of `jsonb_array_elements` to tsvector inside a PL/pgSQL procedure

查看:552
本文介绍了在PL / pgSQL过程中将jsonb_array_elements的多行结果扩展到tsvector的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

过花,



我有一个JSON数组项目,例如(PostgreSQL 9.4):

  [{name: foo},
{name: bar},
{name: baz}]

我想要的是将所有项目的名称连接到 tsvector

如果我运行:

  SELECT to_tsvector(array_to_string(array(SELECT jsonb_array_elements(items)->>'name'FROM store),','))

我可以得到预期的结果:'foo':1'bar':2'baz':3



但是我遇到了这样的问题:

 创建或替换功能update_tsv()
返回触发器为$$
开始
NEW.tsv = to_tsvector(jsonb_array_elements(NEW.items)->>'name');
返回新;
END;
$$语言 plpgsql;

to_tsvector 抱怨有多行。 / p>

已附加 sqlfiddle



任何帮助将不胜感激!

解决方案

您会尝试吗?像这样:

 创建或替换功能update_tsv()
将触发器作为$$
开始
NEW.tsv = to_tsvector(array_to_string(array(select json_array_elements(NEW.items)->>'name'),''));;
返回新;
END;
$$语言 plpgsql;


overflowers,

I have a JSON array items like this (PostgreSQL 9.4):

[{name: "foo"},
 {name: "bar"},
 {name: "baz"}]

What I want is to concatenate all item's name into a tsvector-typed column so that I can create index on that column.

And if I run:

SELECT to_tsvector(array_to_string(array(SELECT jsonb_array_elements(items)->>'name' FROM store), ','))

I can get an expected result: 'foo': 1 'bar': 2 'baz': 3

But I got stuck at something like this:

CREATE OR REPLACE FUNCTION update_tsv()
RETURNS TRIGGER AS $$
BEGIN
    NEW.tsv = to_tsvector(jsonb_array_elements(NEW.items)->>'name');
    RETURN NEW;
END;
$$ language 'plpgsql';

The to_tsvector complains about multiple rows.

A sqlfiddle is attached.

Any help will be extremely appreciated!

解决方案

Would you try like this:

CREATE OR REPLACE FUNCTION update_tsv()
RETURNS TRIGGER AS $$
BEGIN
    NEW.tsv = to_tsvector(array_to_string(array( select json_array_elements(NEW.items)->>'name' ),' '));
    RETURN NEW;
END;
$$ language 'plpgsql';

这篇关于在PL / pgSQL过程中将jsonb_array_elements的多行结果扩展到tsvector的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆