【问题标题】:Display jsonb data in different columns in PostgreSQL在PostgreSQL的不同列中显示jsonb数据
【发布时间】:2021-10-25 17:48:31
【问题描述】:

我有一个名为 stores 的表,其中包含一个名为 id 的列和一个名为 result 的列。结果列包含一个 jsonb,如下所示: sample

我想在 2 个不同的列中显示 productnamedateOfSale。我正在使用以下内容,但数据显示在单列中。

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

我是 PostgreSQL 新手。

期望的结果:

productname dateofsale
DELL MONITOR 2021
DELL MONITOR 2020
LOGITECH MOUSE 2019

【问题讨论】:

  • 你能告诉我们你想要的结果和你使用的postgres版本吗?
  • @Jeremy 嗨,我使用的是 PostgreSQL 11.5。我用所需的结果编辑了我的问题。谢谢!
  • 您的示例数据不是有效的 JSON
  • 样本数据最好显示为formatted text,而不是屏幕截图。请参阅here,了解有关如何创建漂亮表格的一些提示。

标签: sql postgresql jsonb


【解决方案1】:

试试这个,应该可以:

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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多