Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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
如何删除JSONB数组Postgresql数组对象中的多个值_Json_Postgresql_Sql Update_Jsonb - Fatal编程技术网

如何删除JSONB数组Postgresql数组对象中的多个值

如何删除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

我在下面有一个JSONB数组

[
  {
    "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