【问题标题】:How to ADD and REMOVE in a new json-array element in PostgreSQL V9.4如何在 PostgreSQL V9.4 中添加和删除新的 json-array 元素
【发布时间】: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


【解决方案1】:

我相信你正在寻找

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 查询。

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

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2020-09-05
    • 2020-10-21
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2015-10-19
    相关资源
    最近更新 更多