假设我有一个无序的数组(即在这个数组中的元素的顺序可能是不同的表中的每一行)简单的字符串像["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"'