首页 > 解决方案 > 从 jsonb 中的列表中提取信息

问题描述

我有一个名为 jsonb 的列jsonb,其中包含以下格式的数据。

{
"stuff": [
    {
        "name": "foo",
        "percent": "90.0000"
    },
    {
        "name": "bar",
        "percent": "10.0000"
    }
],
"countries": [
    {
        "name": "USA",
        "value": "30"
    },
    {
        "name": "Canada",
        "value": "25"
    },
    {
        "name": "Mexico",
        "value": "20"
    },
    {
        "name": "Ecuador",
        "value": "10"
    }
]
}

我在处理这些数据时遇到了很多麻烦。具体来说,我想要做的是找到所有不同的值"name"可以有 in"stuff"以及 in "countries",有点像SELECT distinct.

但我的问题是我似乎无法从这个 jsonb 中提取任何有用的东西。到目前为止,我的方法是做 SELECT jsonb->>'stuff' FROM table,但这只给了我一个text包含的类型列[{"name": "foo","percent": "90.0000"},{"name": "bar","percent": "10.0000"}]

但由于这是文本,我真的无法用它做任何事情。我也尝试过SELECT jsonb_array_elements_text(jsonb) FROM table,但返回了以下错误:

ERROR:  cannot extract elements from an object
SQL state: 22023

非常感谢使用这种数据格式的任何帮助!

标签: postgresqljsonb

解决方案


您需要分别取消嵌套每个数组,然后在这两个步骤的结果上创建一个联合:

select c.x ->> 'name'
from the_table
  cross join lateral jsonb_array_elements(json_column -> 'countries') as c(x)
union 
select s.x ->> 'name'
from the_table
  cross join lateral jsonb_array_elements(json_column -> 'stuff') as s(x);

在线示例:https ://rextester.com/ZEOIXF91294


推荐阅读