在postgres中选择或提取jsonb数据中的所有键值

时间:2016-10-12 05:48:18

标签: json postgresql jsonb

我的postgres表中有一个jsonb列,数据已填充并存储在其中。





以下是存储在jsonb列中的数据样本格式




 <代码> {&#XA; “unknown_value1”:{&#xA; “code”:“code 1”,&#xA; “标题”:“样本标题1”,&#xA; “parent_title”:“parent1”,&#xA; “framework_code”:“ABC”&#xA; },&#XA; “unknown_value2”:{&#xA; “code”:“code 2”,&#xA; “标题”:“样本标题2”,&#xA; “parent_title”:“parent2”,&#xA; “framework_code”:“ABC”&#xA; }&#xA;}&#xA;  
&#xA;&#xA;

现在我需要从键'parent_title'中提取所有值,而不指定最外面的键(unknown_value1,unknown_value2) )。

&#xA;&#xA;

最外面的密钥是未知的,它可以是任何值,每个数据都会发生变化。

&#xA;&#xA;

但内部的密钥json(code,title,parent_title和framework_code)是常量,它不会因任何值而改变。

&#xA;&#xA;

帮我提取这个jsonb数据。

&#xA;&#xA;

提前致谢!

&#xA;

1 个答案:

答案 0 :(得分:4)

在横向连接中使用级联jsonb_each()

with data(json_value) as (
values (
    '{
        "unknown_value1": {
            "code": "code 1",
            "title": "sample title 1",
            "parent_title": "parent1",
            "framework_code": "ABC"
        },
        "unknown_value2": {
            "code": "code 2",
            "title": "sample title 2",
            "parent_title": "parent2",
            "framework_code": "ABC"
        }
    }'::jsonb)
)

select j1.key as outer_key, j2.key, j2.value
from data
cross join lateral jsonb_each(json_value) j1
cross join lateral jsonb_each(value) j2

   outer_key    |      key       |      value       
----------------+----------------+------------------
 unknown_value1 | code           | "code 1"
 unknown_value1 | title          | "sample title 1"
 unknown_value1 | parent_title   | "parent1"
 unknown_value1 | framework_code | "ABC"
 unknown_value2 | code           | "code 2"
 unknown_value2 | title          | "sample title 2"
 unknown_value2 | parent_title   | "parent2"
 unknown_value2 | framework_code | "ABC"
(8 rows)