繁体   English   中英

POSTGRESQL:如何查询嵌套的 JSONB 对象以获取过滤后的 JSONB 对象?

[英]POSTGRESQL: How to query nested JSONB object to get a filtered JSONB object?

输入JSON

{
"orderId": "order1",
"fulfillerId":"ful1",
"orderDetailsUrl":"het",
"items":[{
        "decorationTechnology":"laserEngraving",
        "itemId":"item1",
        "productName":"Test Sku for Oracle testing"
    },
    {
        "decorationTechnology":"laserEngraving",
        "itemId":"item2",
        "productName":"Test Sku for Oracle testing"
    }
  ]
}

预期输出 JSON

{
   "fulfillerIds":[
      "ful1"
   ],
   "orderIds":[
      "order1"
   ],
   "itemIds":[
       "item1",
        "item2"
   ]
}

需要形成高于预期的 JSON 尝试使用 row_to_json() 和 jsonb_array_elements() 但无法获得预期的输出

如果您使用的是 Postgres 12 或更高版本,则可以使用 SQL/JSON 路径查询:

select jsonb_build_object(
         'orderIds', jsonb_path_query_array(the_column, '$.orderId'), 
         'fulfillerIds', jsonb_path_query_array(the_column, '$.fulfillerId'),
         'itemIds', jsonb_path_query_array(the_column, '$.items[*].itemId')
       ) as filtered
from the_table;

在早期版本中,它适用于串联和构建数组:

WITH t1 AS
    (
        SELECT '{ "orderId": "order1", "fulfillerId":"ful1", "orderDetailsUrl":"het", "items":[{ "decorationTechnology":"laserEngraving", "itemId":"item1", "productName":"Test Sku for Oracle testing" }, { "decorationTechnology":"laserEngraving", "itemId":"item2", "productName":"Test Sku for Oracle testing" } ] } '::jsonb AS field
    )
SELECT jsonb_build_object('orderId', json_build_array (field->>'orderId')) || jsonb_build_object('fulfillerId', json_build_array (field->>'fulfillerId')) || jsonb_build_object('orderDetailsUrl', json_build_array (field->>'orderDetailsUrl')) AS jsonb_result
FROM t1
;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM