2016-08-19 2 views
2

일치하는 키를 기반으로 jsonb 결과를 얻으려고합니다. 번호와 데이터 열이있는 DB 테이블 "목록"이 있습니다.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]"}] 
} 
]} 

나는 키를 사용하여 데이터 열에 대한 모든 값을 끌어 필요 -

  • 명 -> FIRSTNAME
  • 명 ->이 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 배열을 가져와 jsonb_array_elements()을 다시 수행하는 외부 쿼리에서 다시 래핑해야합니다.

+0

phonenumber와 email의 0 번째 요소에 대해 jsonb_extract_path_text를 추가했습니다. jsonb_extract_path_text (사람 -> '전자 메일'-> 0 - >> '주소') 및 사람들 -> '전자 메일'-> 0 - >> jsonb_extract_path_text ('주소')를 시도했습니다. 아무것도 작동하지 않는 것 같습니다. 가능한 모든 아이디어가 있습니까? – phpfreak

+0

''jsonb_extract_path()''jsonb_extract_path()'함수는''jsonb_extract_path (data, '{people, 0, Email, 0, address}') 형식을 갖기 위해' 'to [email protected] "을 입력하십시오. "사람"배열이 이미 압축 해제 된 위의 해결책에서 모든 사람들의 첫 번째 전자 메일 주소를 얻으려면'jsonb_extract_path (people, '{Email, 0, address}')'를 사용하십시오. – Patrick

+0

오, 정말 고마워! – phpfreak

관련 문제