Hen*_*ith 6 sql arrays postgresql json jsonb
device_id | device
-----------------------------
9809 | { "name" : "printer", "tags" : [] }
9810 | { "name" : "phone", "tags" : [{"count": 2, "price" : 77}, {"count": 3, "price" : 37} ] }
Run Code Online (Sandbox Code Playgroud)
对于包含数组“标签”的 jsonb 列“设备”上的以下 postgres SQL 查询:
SELECT t.device_id, elem->>'count', elem->>'price'
FROM tbl t, json_array_elements(t.device->'tags') elem
where t.device_id = 9809
Run Code Online (Sandbox Code Playgroud)
device_id 是主键。
我有两个问题不知道如何解决:
您的第一个问题可以通过使用左外连接来解决,它将用 NULL 值替换右侧缺失的匹配项。
json_agg第二个问题可以使用、array_agg或等聚合函数来解决string_agg,具体取决于所需的结果类型:
SELECT t.device_id,
jsonb_agg(elem->>'count'),
jsonb_agg(elem->>'price')
FROM tbl t
LEFT JOIN LATERAL jsonb_array_elements(t.device->'tags') elem
ON TRUE
GROUP BY t.device_id;
Run Code Online (Sandbox Code Playgroud)
您将得到一个 JSON 数组,其中仅包含null数组为空的行,我希望这对您来说没问题。