Postgresql 博士后&x2B;jsonb+;从多维数组中获取键的值

Postgresql 博士后&x2B;jsonb+;从多维数组中获取键的值,postgresql,jsonb,Postgresql,Jsonb,我正在尝试根据匹配的键获取jsonb结果。 我有DB表“清单”,其中有数字和数据列 number | data 1 | {"name": "XYZ company", "city": "toronto", "province": "ON", "people" : [ { "firstName": "tom", "lastName": "hanks", "phonenumber": [{"type": "mobile", "Number": "111111"

我正在尝试根据匹配的键获取jsonb结果。 我有DB表“清单”,其中有数字和数据列

    number | data  
      1    |  {"name": "XYZ company", "city": "toronto", "province": "ON", "people" : [
{ "firstName": "tom", "lastName": "hanks", 
   "phonenumber": [{"type": "mobile", "Number": "111111"}], 
    "Email": [{"type": "business", "address": "tom@xyz.com"},{"type": "personal", "address": "tom@mailinator.com"}] }, 

{ "firstName": "sandra", "lastName": "petes", 
   "phonenumber": [{"type": "mobile", "Number": "333"}, {"type": "home", "Number": "444"}], 
    "Email": [{"type": "business", "address": "sandra@xyz.com"}] 
}
]}
我需要用键拉取数据列的所有值-

  • 人物->名字
  • 人物->姓氏
  • 人员->电话号码->号码
  • 人员->电子邮件->地址
到目前为止,我取得的成就是:

SELECT   number 
        ,jonb_array_length(jsonb_extract_path(data,'people')) as people_count
        ,jsonb_extract_path(data,'people','0','firstname') as FirstName
        ,jsonb_extract_path(data,'people','0','lastname') as LastName
        ,jsonb_extract_path(data,'people','0','email','Address'") as personEmail
        ,jsonb_extract_path(data,'people','0','phonenumber','Number') as personPhone
FROM    listings
WHERE   number='1';
但是,这只给了我第0个元素的人,我需要找到所有元素。有没有办法在单个查询中实现这一点


谢谢你的时间

您需要使用
jsonb\u array\u elements()
函数来获取数组的所有元素。由于该函数返回一组行,因此需要将其用作行源

SELECT '1' AS number, 
       jsonb_array_length(data->'people') AS people_count,
       people->>'firstname' AS FirstName,
       people->>'lastname' AS LastName,
       people->'email'->0->>'Address' AS personEmail,
       people->'phonenumber'->0->>'Number' as personPhone
FROM listings, jsonb_array_elements(data->'people') p(people)
WHERE number = '1';

这将为每个人生成一行,其中
number='1'
。电子邮件和电话号码对象也是数组,我在这里只选择第一个值。如果您想要所有这些元素,只需获取整个JSON数组,然后将其包装到一个外部查询中,再次执行
jsonb\u array\u elements()

在这个查询中,我想做的另一件事是为phonenumber和email的第0个元素提取jsonb\u path\u文本。我试过jsonb_extract_path_text(人物->'email'->0->>>'Address')和人物->'email'->0->>jsonb_extract_path_text('Address')。似乎什么都不管用。。如果可能的话,你知道吗?
jsonb_extract_path()
函数需要一个
jsonb
参数,后跟路径作为
text[]
,因此格式是
jsonb_extract_path(数据,{people,0,Email,0,address}')
tom@xyz.com". 在我上面的解决方案中,“people”数组已经解包,您可以使用
jsonb_extract_path(people,{Email,0,address}')
获取所有人的第一个电子邮件地址。