如何从postgres中原始字符串的jsonb数组中删除特定元素?



假设我有一个无序的数组(即在这个数组中的元素的顺序可能是不同的表中的每一行)简单的字符串像["Foo", "Bar", "Baz"],我怎么能简单地删除(例如)"Bar"元素?我所有的研究都假设jsonb数组将包含带有标识符的对象,但没有过滤原始字符串的功能。

需要注意的一点是,实际列的类型不是jsonb,而是文本。在查询中,我只是将其强制转换为jsonb,以便可以轻松地插入元素:

SELECT jsonb_insert(element::jsonb, '{0}', '"Bar"')::TEXT FROM table

列中原始文本值为["Foo", "Bar", "Baz"]

但是不,我需要一个方法来反转这个查询。

您可以使用-操作符:

select '["Foo", "Bar", "Baz"]'::jsonb - 'Bar'

返回["Foo", "Baz"]

如果你的列没有定义为jsonb(为什么?),那么转换它:the_column::jsonb - 'Bar'

。在update语句中:

update the_table
set the_column = (the_column::jsonb - 'Bar')::text
where ...

这似乎奏效了:

create or replace function remove_key(p_input jsonb, p_to_remove jsonb)
returns jsonb
as
$$
select jsonb_agg(e)
from jsonb_array_elements(p_input) as t(e)
where t.e <> p_to_remove;
$$
language sql
immutable;
update table set "flags"=coalesce(remove_key(row::jsonb, '"value"'::jsonb), '[]'::jsonb)::text

其中'"value"'将是您要过滤的任何内容,即'"Bar"'

相关内容

  • 没有找到相关文章