如何删除JSONB数组Postgresql数组对象中的多个值
我在下面有一个JSONB数组如何删除JSONB数组Postgresql数组对象中的多个值,json,postgresql,sql-update,jsonb,Json,Postgresql,Sql Update,Jsonb,我在下面有一个JSONB数组 [ { "name": "test", "age": "21", "phone": "6589", "town": "54" }, { "name": "test12", "age": &q
[
{
"name": "test",
"age": "21",
"phone": "6589",
"town": "54"
},
{
"name": "test12",
"age": "67",
"phone": "6546",
"town": "54"
},
{
"name": "test123",
"age": "21",
"phone": "6589",
"town": "54"
},
{
"name": "test125",
"age": "67",
"phone": "6546",
"town": "54"
}
]
现在我想删除名称为test或test125的对象。如何删除JSONB数组中的多个或单个值?如果您有Postgres 12,您可以使用
JSONB\u path\u query\u array
函数过滤JSONB
以下是问题示例:
带t(j)作为(值('[
{“姓名”:“测试”、“年龄”:“21”、“电话”:“6589”、“城镇”:“54”},
{“姓名”:“测试12”,“年龄”:“67”,“电话”:“6546”,“城镇”:“54”},
{“姓名”:“test123”,“年龄”:“21”,“电话”:“6589”,“城镇”:“54”},
{“姓名”:“测试125”,“年龄”:“67”,“电话”:“6546”,“城镇”:“54”}
]“::jsonb))
选择jsonb_路径_查询_数组(j,
“$[*]”?(@.name!=“test”&&&&&@.name!=“test125”))
从t;
有关的更多信息,我将创建一个函数:
create function remove_array_elements(p_data jsonb, p_key text, p_value text[])
returns jsonb
as
$$
select jsonb_agg(e order by idx)
from jsonb_array_elements(p_data) with ordinality as t(e,idx)
where t.e ->> p_key <> ALL (p_value) ;
$$
language sql
immutable;
一条包含子查询的update语句将发现以下操作: 选择以下选项:
1. UPDATE tab
SET jsdata = t.js_new
FROM
(
SELECT jsonb_agg( (jsdata ->> ( idx-1 )::int)::jsonb ) AS js_new
FROM tab
CROSS JOIN jsonb_array_elements(jsdata)
WITH ORDINALITY arr(j,idx)
WHERE j->>'name' NOT IN ('test','test125')
) t
或者这个:
2. WITH t AS (
SELECT jsonb_agg( (jsdata ->> ( idx-1 )::int)::jsonb ) AS js_new
FROM tab
CROSS JOIN jsonb_array_elements(jsdata)
WITH ORDINALITY arr(j,idx)
WHERE j->>'name' NOT IN ('test','test125')
)
UPDATE tab
SET jsdata = js_new
FROM t
函数删除数组元素(jsonb,未知,整数[])不存在提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型。获取此错误更新“卡路里追踪者”设置“卡路里消耗”=删除数组元素(“卡路里消耗”,“c_id”,数组[21]),其中c_id=40您传递的是整数数组,而不是
text
数组。在删除数组元素中,我传递的_列是我的JSON,因此我得到此错误数组错误:列“21”不存在位置:此解决方案对我有效。谢谢@BarbarosÖzhan
2. WITH t AS (
SELECT jsonb_agg( (jsdata ->> ( idx-1 )::int)::jsonb ) AS js_new
FROM tab
CROSS JOIN jsonb_array_elements(jsdata)
WITH ORDINALITY arr(j,idx)
WHERE j->>'name' NOT IN ('test','test125')
)
UPDATE tab
SET jsdata = js_new
FROM t