如何在PostgreSQL V9.4中添加和删除新的json数组元素
我正在做一个循环来创建一个只包含特定元素的新json矩阵,为此我需要遍历之前创建的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_构建
[
{"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查询,最终构造所需的数据。