【发布时间】:2020-02-01 23:33:14
【问题描述】:
我正在创建一个循环来创建一个仅包含某些元素的新 json 矩阵,为此我需要根据之前创建的 json-array 和 PUSH (ADD ELEMENT) 和 POP (REMOVE ELEMENT) 元素条件。
我收到类似的东西
[
{"id":1 , "data": "test_a"},
{"id":2 , "data": "test_t"},
{"id":3 , "data": "test_h"},
.....
]
我正在对循环做这样的事情
DECLARE
_test json;
i json;
_new_jsn json;
BEGIN
_test := SELECT json_agg(json_build_object('id', 1, 'data', 'test'))
FOR i IN SELECT * FROM json_array_elements(_test) LOOP
RAISE NOTICE 'element %',i;
END LOOP;
从这里开始,我不知道如何继续在新参数中添加和删除元素。
我的过滤器基于 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"},
.....
]
【问题讨论】:
-
“push”和“pop”是什么意思?你真的需要在最后向数组添加/删除元素吗?还是只需要过滤数组中的元素?您需要通过什么条件或参数在它们之间做出选择?
-
@Bergi 是的,我不知道如何在循环内的新变量中添加元素,例如,如果我有
_new_jsn =[{"id":1 , "data": "test_a"}]并且在循环之后我想要_new_jsn= [{"id":1 , "data": "test_a"}, {"id":2 , "data": "test_b"}]。关于过滤器基于 IF - ELSE,但我已经知道如何做到这一点,我的主要问题相当于 JS 中的 push() "add" 和 pop()"remove" -
您是否要更改字段中 JSON 中的列表?如果是这样,您需要重新组装 JSON 并将其编写为一件事。
-
第二个元素的值是从哪里来的(
2,test_b)?条件是否取决于数组中的第一个元素? -
停止思考程序化和 JSON 方面的问题。编写一个声明式 SQL 查询,最终构造出你想要的数据。
标签: sql arrays database postgresql postgresql-9.4