2017-09-18 3 views
0

저는 JSON/JSONB 데이터 타입을 처음 접했고 더 깊은 레벨에서 JSONB 요소를 선택하는 데 문제가 있습니다.더 깊은 레벨에서 PostgreSQL 중첩 JSONB를 쿼리하는 방법은 무엇입니까?

------------------------ 
| id | Favorite colors | 
------------------------ 
| 1 | blue   | 
------------------------ 
| 1 | red    | 
------------------------ 
| 3 | blue   | 
------------------------ 
| 3 | red    | 
------------------------ 
| 3 | green   | 
------------------------ 


: - -> '즐겨 찾기'예를 들어, >> '색상'

CREATE TABLE person (id integer, details jsonb); 

INSERT INTO person (id, details) VALUES 
("id": 1, {"favorites":{"colors":"blue", "colors":"red"}}), 
("id": 2), 
("id": 3, {"favorites":{"colors":"blue", "colors":"red", "colors":"green"}}); 


내가 모든 p.details을 선택하고 싶습니다 : 여기

는 예를 들어 테이블 다음과 같이 (또는 유사한) 즐겨 찾기 색상에 빈 열을 표시합니다 (jsonb_array_elements와 함께 시도).

SELECT p.id, p.details ->'favorites' ->>'colors' AS "Favorite colors" 
FROM "person" p; 

SELECT p.id, json_array_elements((p.details ->'favorites' ->>'colors')::json) AS "Favorite colors" 
FROM "person" p; 


다음은 간단한 쿼리와 작동하지만 더 많은 데이터를 검색 할 때 브라우저가 충돌합니다 (최종 사용자는 웹 브라우저에서 쿼리를 사용함).

SELECT p.id, ((json_array_elements((json_array_elements(p.details::json)::json->>'favorites')::json))::json->>'colors') AS "Favorite colors" 
    FROM "person" p; 

브라우저가 많은 메모리를 소비하고있는 것으로 보입니다. json_array_elements 호출을 여러 번 호출하면 쿼리 속도가 느려진다는 내용의 게시물을 발견했습니다. https://www.postgresql.org/message-id/[email protected]

이것에 대한 조언이 있으십니까?

+0

무엇 "브라우저"당신이 언급하는? 파이어 폭스? 크롬? 그러면 해당 브라우저에서 쿼리 결과를 어떻게 표시합니까? 어떤 프로그래밍 언어를 사용하고 있습니까? 그리고 "브라우저 충돌"이란 정확히 무엇을 의미합니까? 브라우저에 표시 할 데이터가 적습니까? 브라우저의 메모리 소비량은 PostgreSQL 서버의 메모리 사용량과 아무 관련이 없습니다. 'explain (analyze, buffers) '이 당신에게 그 쿼리를 보여줄 것인가? –

답변

0

제공 한 SQL 쿼리에 구문 오류가 있습니다.

DROP TABLE person; 
CREATE TABLE person (id integer, details jsonb); 

INSERT INTO person (id, details) VALUES 
(1, '{"favorites":[{"colors":"blue"}, {"colors":"red"}]}'::jsonb), 
(2, '{}'::jsonb), 
(3, '{"favorites":[{"colors":"blue"}, {"colors":"red"}, {"colors":"green"}]}'::jsonb); 

이 당신을 통해 결과를 얻을 수있는 것보다 올바른 경우 : 그들은 다음과 같습니다 것보다 내가 제대로 DB 스키마를 짐작하는 경우

select id, jsonb_array_elements(details->'favorites')->'colors' from person 
관련 문제