从Postgresql {J}中的JSONB中提取值

时间:2017-02-21 15:24:01

标签: postgresql jsonb

我有一个表(用户),其中我存储了不同的列,其中一列是名为content的 jsonb 列。其他列并不重要,因为它们引用了日期和其他非相关的东西。在那个jsonb列中,我们存储了一个具有以下语法的文件:

{
 "Root": {
    "Users": {
        "user1": {
            "Email": {
                "_value": "user1@email.com"
            },
            "FullName": {
                "_value": "User1"
            },
            "Teams": {
                "_value": "TeamA, TeamB"
            },
        "user2": {
            "Email": {
                "_value": "user2@email.com"
            },
            "FullName": {
                "_value": "User2"
            },
            "Teams": {
                "_value": "TeamA, TeamB, TeamC"
            }, 
.... 

我想要实现的目标:从这个jsonb中提取所有用户,并在表格中提取每个参数,如下所示:

username |      email    |  fullname   |   teams
user1    |user1@email.com|  User1      | TeamA, TeamB
user2    |user2@email.com|  User2      | TeamA, TeamB, TeamC

我尝试使用 jsonb_object_keys (内容 - >'Root' - >'用户')并设法提取所有用户但似乎无法在树中继续提取每个用户每个用户的价值。我被封锁了,似乎找不到任何适合我的东西。最终目标是根据我提供的Team参数提取具有所述详细信息的每个用户,因此我将把所有内容都放在一个函数中。我继承了这个结构,同时我是使用jsonb general的新手。 即使是某种能够以某种方式压扁这种jsonb的东西也会很棒。

使用的PostgreSQL版本:9.5

如果有人有一些意见,我们将不胜感激。感谢。

1 个答案:

答案 0 :(得分:2)

teams是一个家庭作业,其余部分如下:

t=# with o as (with j as (select '
{
 "Root": {
    "Users": {
        "user1": {
            "Email": {
                "_value": "user1@email.com"
            },
            "FullName": {
                "_value": "User1"
            },
            "Teams": {
                "_value": "TeamA, TeamB"
            }
        },
        "user2": {
            "Email": {
                "_value": "user2@email.com"
            },
            "FullName": {
                "_value": "User2"
            },
            "Teams": {
                "_value": "TeamA, TeamB, TeamC"
            }
        }
    }
  }
}'::jsonb v)
select key,value from j join jsonb_each(j.v->'Root'->'Users') on true) select key username, value->'Email'->>'_value' email, value->'FullName'->>'_value' fullname from o;
 username |      email      | fullname
----------+-----------------+----------
 user1    | user1@email.com | User1
 user2    | user2@email.com | User2
(2 rows)