2016-08-19 76 views
2

我想根据匹配键获取jsonb结果。 我有数据库表“列表”与数字和数据列。postgres + jsonb +从多维数组中获取密钥的值

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

{ "firstName": "sandra", "lastName": "petes", 
    "phonenumber": [{"type": "mobile", "Number": "333"}, {"type": "home", "Number": "444"}], 
    "Email": [{"type": "business", "address": "[email protected]"}] 
} 
]} 

我需要拉的数据列的所有值的钥匙 -

  • 以人为>姓
  • 以人为> lastName的
  • 以人为> phonenumber->数
  • 人 - >电子邮件 - >地址

我到目前为止取得的成绩是:

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个元素的人,我需要找到所有元素。有没有办法在单个查询中实现这一点。

谢谢你的时间!

回答

2

您需要使用jsonb_array_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数组,你只需要得到整个JSON数组,然后将其包装在一个外部查询中,你再次执行jsonb_array_elements()

+0

我想在此查询中完成的另一件事是针对电话号码和电子邮件的第0个元素的jsonb_extract_path_text。我试过了jsonb_extract_path_text(people - >'email' - > 0 - >>'Address')以及people - >'email' - > 0 - >> jsonb_extract_path_text('Address')。似乎没有任何工作..任何想法,如果它是可能的? – phpfreak

+0

函数'jsonb_extract_path()'需要一个'jsonb'参数,后面是一个'text []',因此格式为'jsonb_extract_path(data,'{people,0,Email,0,address}') '得到“[email protected]”。在上面的解决方案中,“people”数组已经解包,您可以使用'jsonb_extract_path(people,'{Email,0,address}')'获取所有人的第一个电子邮件地址。 – Patrick

+0

哦真棒,谢谢! – phpfreak