Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/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
如何在PostgreSQL V9.4中添加和删除新的json数组元素_Sql_Arrays_Database_Postgresql_Postgresql 9.4 - Fatal编程技术网

如何在PostgreSQL V9.4中添加和删除新的json数组元素

如何在PostgreSQL V9.4中添加和删除新的json数组元素,sql,arrays,database,postgresql,postgresql-9.4,Sql,Arrays,Database,Postgresql,Postgresql 9.4,我正在做一个循环来创建一个只包含特定元素的新json矩阵,为此我需要遍历之前创建的json数组,并根据条件推送(添加元素)和弹出(删除元素) 我收到这样的东西 [ {"id":1 , "data": "test_a"}, {"id":2 , "data": "test_t"}, {"id":3 , "data": "test_h"}, ..... ] 我正在对环路做类似的事情 声明 _测试json; i json; _新的jsn json; 开始 _测试:=选择json_agg(json_构建

我正在做一个循环来创建一个只包含特定元素的新json矩阵,为此我需要遍历之前创建的json数组,并根据条件推送(添加元素)和弹出(删除元素)

我收到这样的东西

[
{"id":1 , "data": "test_a"},
{"id":2 , "data": "test_t"},
{"id":3 , "data": "test_h"},
.....
]
我正在对环路做类似的事情

声明
_测试json;
i json;
_新的jsn json;
开始
_测试:=选择json_agg(json_构建_对象('id',1',data','test'))
对于从json_数组_元素(_测试)循环中选择*的i
提出通知“元素%”,i;
端环;
从这里开始,我不知道如何继续在新参数中添加和删除元素

我的过滤器基于IF-ELSE,因此如果我有

       FOR i IN SELECT * FROM json_array_elements(_test) LOOP
         IF i->>id > 2 THEN
         ..... Add the element in _new_jsn
         ELSE
         .... Remove/Ignore the element
         END IF; 
        END LOOP;
我想在循环之后收到这样的东西

[
{"id":3 , "data": "test_h"},
{"id":4 , "data": "test_c"},
.....
]

我相信你在找我

DECLARE
  test CONSTANT json := json_build_array(
   json_build_object('id', 1, 'data', 'test_a'),
   json_build_object('id', 2, 'data', 'test_t'),
   json_build_object('id', 3, 'data', 'test_h'),
   json_build_object('id', 4, 'data', 'test_c')
  );
  result json;
BEGIN
  result := (SELECT json_agg(el)
    FROM json_array_elements(test) AS t(el)
    WHERE (el->>'id')::int > 2);
  -- …
END;
这里不需要任何循环或
IF
语句。只需使用
WHERE
子句进行
SELECT
查询


(我没有找到比引发异常更好的打印结果的方法:-/)

你说的“推”和“弹出”是什么意思?您真的需要在最后向数组添加/删除元素吗?还是只需要过滤数组中的元素?通过什么条件或参数,您需要在它们之间进行选择?@Bergi是的,我不知道如何在循环中的新变量中添加元素,例如,如果我有
\u new\u jsn=
[{“id”:1,“data”:“test\u a”}]
在循环之后,我想要
\u new\u jsn=[{“id”:1,“data”:“test a”},{“id”:2,“data”:“test b”}]
。关于过滤器是基于IF-ELSE的,但我已经知道如何做到这一点,我的主要问题是与JSON中的push()“add”和pop()“remove”等效。您是否希望更改字段中JSON中的列表?如果是这样,您需要重新组装JSON并将其作为一件事写入。第二个元素的值来自何处(
2
test_b
)?这个条件是否取决于数组中的第一个元素?不要再以JSON的形式来思考这个问题。编写一个声明性SQL查询,最终构造所需的数据。