2016-08-18 5 views
3

에서 JSON 개체로부터 값 I이 유사한 콘텐츠를 갖는 포스트 그레스 테이블을 갖는다.추출 키 포스트 그레스

id | key | value 

1 | a | 4 
1 | b | 5 
2 | a | 6 
2 | b | 7 
3 | a | 8 
3 | b | 9 

이이 포스트 그레스 SQL 달성 될 수있다 : 결과는 다음과 같습니다 있도록

는 내가 JSON에서 키와 값을 확장 할 수있게하려면? 원래 테이블과 같은 시뮬레이션 할 수 있다는 것을 나는 감안할 때

을 시도했습니다 무엇


:

select * 
from 
(
values 
(1, '{"a":"4", "b":"5"}'::json), 
(2, '{"a":"6", "b":"7"}'::json), 
(3, '{"a":"8", "b":"9"}'::json) 
) as q (id, data) 

내가 사용 단지 키를 얻을 수 있습니다 :

select id, json_object_keys(data::json) 
from 
(
values 
(1, '{"a":"4", "b":"5"}'::json), 
(2, '{"a":"6", "b":"7"}'::json), 
(3, '{"a":"8", "b":"9"}'::json) 
) as q (id, data) 

그리고 나는 이것들을 다음과 같이 레코드 세트로 얻을 수 있습니다 :

select id, json_each(data::json) 
from 
(
values 
(1, '{"a":"4", "b":"5"}'::json), 
(2, '{"a":"6", "b":"7"}'::json), 
(3, '{"a":"8", "b":"9"}'::json) 
) as q (id, data) 

그러나 id, key 및 value를 사용하여 결과를 얻는 방법을 배울 수 없습니다.

아이디어가 있으십니까?

참고 : 실제로 작업하고있는 json은 이보다 중첩되어 있지만이 예제는 내 근본적인 문제를 잘 나타냅니다.

+0

[postgresql 9.4 jsonb를 함수/서버 측 언어없이 객체로 변환하는 방법] (http://stackoverflow.com/questions/27181980/how-to-convert-postgresql-9-4-jsonb-to -object-without-function-server-side-langu) – e4c5

+0

컬럼이 아닌'json_object_keys' 또는'json_each' 함수를 테이블로 사용하십시오 :'select id, j.key, my_table의 j.value, json_each (data) j' – Abelisto

+0

감사합니다. Abelisto. 확실히 나는 당신이 제안하는 쿼리를 사용하여 찾고있는 테이블이 아닌 전체 데카르트 제품으로 끝낼 것입니까? –

답변

6
SELECT q.id, d.key, d.value 
FROM q 
JOIN json_each_text(q.data) d ON true 
ORDER BY 1, 2; 

이 함수는 집합 반환 함수이므로 행 원본으로 사용해야합니다. 이 함수의 결과는 테이블 q에 대한 joined laterally이며, 테이블의 각 행에 대해 data 열의 각 (key, value) 쌍은 해당 행에만 연결되므로 원래 행과 json 개체 유지된다.

q은 매우 복잡한 하위 쿼리 (또는 질문 에서처럼 VALUES 절) 일 수 있습니다. 함수에서 해당 하위 쿼리의 결과에서 적절한 열을 사용하므로 하위 쿼리의 별칭 및 하위 쿼리의 (별칭)에 대한 참조 만 사용합니다.

+0

감사합니다. Patrick. 나는 원래의 쿼리를 어떻게 맞추 었는지 아직도 조금 혼란 스럽다. 'WITH'문을 사용하여 'q'를 정의합니까? –

+0

WITH 문 없이는 얻을 수 있습니까? –

+0

'q'는 당신이 참조했던 테이블이고, 원래 테이블의 프록시로 사용했습니다. – Patrick