【问题标题】:Creating NUMERIC array from JSONB data in Postgres在 Postgres 中从 JSONB 数据创建 NUMERIC 数组
【发布时间】:2021-08-05 09:26:20
【问题描述】:

我有一个 Postgres JSONB 数据,其中包含一个 NUMERIC 类型的数组。我想提取此 ARRAY 并将其存储在 NUMERIC[] 类型的变量中。这是我的 JSONB 对象。

{
  "userIds": [
    101,102,103
  ],
  "userRole": {
    "id": "1",
    "name": "Administrator"
  }
}

如何从这个 JSONB 对象中提取用户 ID 并将它们存储在 NUMERIC[] 中,因为我必须在这个 NUMERIC[] 上进行迭代?

任何帮助将不胜感激。

【问题讨论】:

    标签: sql postgresql jsonb


    【解决方案1】:

    一种方法是使用jsonb_array_elements 提取ID,将它们解析为正确的数据类型并再次将它们聚合到一个数组中,例如:

    SELECT array_agg(id) FROM (
      SELECT
        (jsonb_array_elements('{
          "userIds": [101,102,103],
          "userRole": {
             "id": "1",
             "name": "Administrator"
         }
       }'::jsonb->'userIds')::numeric)) j(id);
    
       array_agg   
    ---------------
     {101,102,103}
    (1 row)
    

    如果您想将这些值作为结果集中的行进行迭代,请不要打扰外部查询:

    SELECT
      jsonb_array_elements('{
        "userIds": [101,102,103],
        "userRole": {
       "id": "1",
       "name": "Administrator"
        }}'::jsonb->'userIds')::numeric;
    
     jsonb_array_elements 
    ----------------------
                      101
                      102
                      103
    (3 rows)
    

    【讨论】:

    • Jim Jones : 这句话有什么问题?控制台上没有打印任何内容。 FOREACH userId IN ARRAY(SELECT array_agg(id) FROM (SELECT json_array_elements(jsonb -> 'userIds') :: NUMERIC) j(id)) LOOP RAISE NOTICE 'userId --> %', userId;结束循环;
    • jsonb 是变量/参数吗?
    • 是的,它是一个变量 userRoleJsonb,它包含 { "userIds": [ 101,102,103 ], "userRole": { "id": "1", "name": "Administrator" } }跨度>
    • @java_maestros 有帮助吗? CREATE OR REPLACE FUNCTION testfunc(jsonb) RETURNS VOID LANGUAGE 'plpgsql' COST 100 VOLATILE AS $BODY$ DECLARE i record; BEGIN FOR i IN SELECT * FROM jsonb_array_elements($1->'userIds') j(id) LOOP RAISE NOTICE 'output from space %', i.id; END LOOP; END; $BODY$;
    • 感谢它的魅力。我使用了错误的功能。它是 jsonb_array_elements。
    猜你喜欢
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2019-03-21
    • 2015-07-12
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多