从 jsonb 中的列表中提取信息

Extracting info out of lists inside a 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""stuff""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

非常感谢任何有关处理这种数据格式的帮助!

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

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