2016-10-09 4 views
3

I 뮤 PostgreSQL을 9.05에서 이들 테이블을 가지고postgresql에서 json 객체를 열로 얻는 방법은 무엇입니까?

표 : 필드 core : name, descriptiondata

data 필드가 JSON 필드 (예를 들면)으로한다 : 항상 {"id": "100", "tax": "4,5"}

one 데이터 당 json.

제 질문은 : 모든 JSON 필드를 쿼리 필드로 가져올 수 있습니까? name, description, id, tax....

문제는 다음과 같습니다. JSON에 다양한 필드가 있으며 ID, 세금 또는 기타가 될 수 있습니다.

+1

보기 [포스트 그레스 :?를 JSONB 필드에서 집계 키/값 쌍을 병합 (http://stackoverflow.com/a/ 35179515/1995738) – klin

답변

5

"동적으로"설정할 수 없습니다. 갖고 싶은 열을 지정해야합니다.

select name, description, id, 
     data ->> 'tax' as tax, 
     data ->> 'other_attribute' as other_attribute 
from core; 

많은 작업을 수행하는 경우보기에 넣을 수 있습니다.


다른 옵션은 JSON의 속성을 나타내는 객체 유형을 Postgres에 만드는 것입니다.

create type core_type as (id integer, tax numeric, price numeric, code varchar); 

당신은 그 유형으로 JSON을 캐스팅 할 수 있으며 JSON에서 해당 속성이 자동으로 열로 변환됩니다 : {"id": "100", "tax": "4.5", "price": "10", "code": "YXCV"} 당신이 할 수 있습니다 :

위의 유형으로

다음과 같은 JSON

select id, (json_populate_record(null::core_object, data)).* 
from core; 

그것은 반환합니다

id | tax | price | code 
---+------+-------+----- 
1 | 4.50 | 10 | YXCV 

그러나 모든 JSON 값 이 해당 오브젝트 필드의 유형으로 형변환 될 수 있는지 확인해야합니다.

개체 유형을 변경하면 해당 개체 유형을 사용하는 모든 쿼리가 자동으로 업데이트됩니다. 따라서 중심 정의를 통해 관심있는 열을 관리 할 수 ​​있습니다.

+0

고맙지 만 모든 열이 json 내부에있을 수 있는지 모르겠다. 1 또는 2 .. 또는 10 일 수 있습니다 ... 동적으로 할 수 있습니까? –

+0

@fh_bash : 내가 말했듯이 : "동적으로"할 수는 없습니다. SQL에서 쿼리의 열 수는 쿼리가 실행되기 전에 정의되어야하며 결과의 모든 행에는 같은 수의 열이 있어야합니다. –

0

PostgreSQL 9.4부터 json_to_record을 사용할 수도 있습니다.

JSON 개체 (아래 참고 참조)에서 임의의 레코드를 작성합니다. 레코드를 반환하는 모든 함수와 마찬가지로 호출자는 AS 절이있는 레코드의 구조를 명시 적으로 정의해야합니다.

:

select * from json_to_record('{"a":1,"b":[1,2,3],"c":"bar"}') as x(a int, b text, d text) 

반환

a | b | d 
---+---------+--- 
1 | [1,2,3] | 
관련 문제