我有一个名为stores的表,其中包含名为id的列和名为result的列。结果列保存一个jsonb它看起来像这样:示例
我想显示productname和dateOfSale在两列中。我正在使用下面的代码,但是数据显示在单列中。SELECT b.field_value AS productName, count(*) FROM
( SELECT * FROM (SELECT (jsonb_array_elements(result)::jsonb)->>'name' field_name,
(jsonb_array_elements(result)::jsonb)->>'value' field_value,
FROM stores WHERE store_id = '1') a
WHERE a.field_name='$.productname OR a.field_name='$dateofSale') b GROUP BY b.field_value
I am new to PostgreSQL.
预期的结果:
productname | dateofsale | 戴尔监控 | 2021 |
---|---|
戴尔监控 | 2020 |
罗技鼠标 | 2019 |
试试这个,应该可以:
SELECT store_id
, jsonb_path_query_first(s.result, '$[*] ? (@.name == "$.productname").value') AS productname
, jsonb_path_query_first(s.result, '$[*] ? (@.name == "$.dateofSale").value') AS dateofsale
FROM stores AS s
WHERE store_id = '1'
但是json数据样本的结构有点奇怪。使用以下简单的json结构代替:
'{"$.productname": "DELL MONITOR", "$.dateofSale": "2021"}'
'{"$.productname": "DELL MONITOR", "$.dateofSale": "2020"}'
'{"$.productname": "LOGITEC MOUSE", "$.dateofSale": "2019"}'
选择语句应该是:
SELECT store_id, s.result->'$.productname' AS productname, s.result->'$.dateofSale AS dateofsale
FROM stores AS s
WHERE store_id = '1'