[sql] 새로운 PostgreSQL JSON 데이터 유형의 필드를 사용하여 쿼리하려면 어떻게합니까?
PostgreSQL 9.2의 새로운 JSON 함수에 대한 문서 및 / 또는 예제를 찾고 있습니다.
특히 일련의 JSON 레코드가 주어진 경우 :
[
{name: "Toby", occupation: "Software Engineer"},
{name: "Zaphod", occupation: "Galactic President"}
]
이름으로 레코드를 찾기 위해 SQL을 작성하는 방법은 무엇입니까?
바닐라 SQL에서 :
SELECT * from json_data WHERE "name" = "Toby"
공식 개발자 매뉴얼은 매우 드물다.
- http://www.postgresql.org/docs/devel/static/datatype-json.html
- http://www.postgresql.org/docs/devel/static/functions-json.html
업데이트 I
내가 조립 한 PostgreSQL을 9.2으로 현재 무엇이 가능한지 자세히 요점을 . 일부 사용자 정의 기능을 사용하면 다음과 같은 작업을 수행 할 수 있습니다.
SELECT id, json_string(data,'name') FROM things
WHERE json_string(data,'name') LIKE 'G%';
업데이트 II
이제 JSON 함수를 자체 프로젝트로 옮겼습니다.
PostSQL -PostgreSQL 및 PL / v8을 완전히 멋진 JSON 문서 저장소로 변환하는 기능 세트
답변
포스트그레스 9.2
pgsql-hackers 목록에서 Andrew Dunstan을 인용 합니다 .
어떤 단계에서는 (json-producing과 반대되는) json-processing 기능이있을 수 있지만 9.2에는 없습니다.
PLV8에서 구현 예제 를 제공하는 것을 방해하지 않습니다. 문제를 해결 .
포스트그레스 9.3
“json-processing”을 추가 할 수있는 새로운 기능과 연산자를 제공합니다.
- 새로운 JSON 기능에 대한 매뉴얼.
- pg 9.3의 새로운 기능에 대한 Postgres Wiki .
- @Will은 아래 코멘트 에서 새로운 운영자 를 시연 하는 블로그 링크를 게시했습니다 .
Postgres 9.3 의 원래 질문 에 대한 답변 :
SELECT *
FROM json_array_elements(
'[{"name": "Toby", "occupation": "Software Engineer"},
{"name": "Zaphod", "occupation": "Galactic President"} ]'
) AS elem
WHERE elem->>'name' = 'Toby';
고급 예 :
더 큰 테이블의 경우 성능을 높이기 위해 표현식 색인을 추가 할 수 있습니다.
포스트그레스 9.4
추가 jsonb
( “이진”의 경우, 값은 기본 Postgres 유형으로 저장 됨) 및 두 유형 모두에 대해 더 많은 기능성 . 위에서 언급 한 표현식 인덱스 외에도 GIN, btree 및 해시 인덱스를jsonb
지원하며 , GIN이 가장 강력합니다.
매뉴얼은 다음과 같이 제안합니다.
일반적으로 객체 키 순서에 대한 레거시 가정과 같은 특수한 요구가없는 한 대부분의 응용 프로그램은 JSON 데이터를로 저장하는 것을 선호해야합니다
jsonb
.
대담한 강조 광산.
포스트그레스 9.5
완벽한 jsonb
기능과 연산자. jsonb
제자리 에서 조작 하고 표시 하기 위해 더 많은 기능을 추가하십시오 .
답변
Postgres 9.3+에서는 ->
연산자를 사용하십시오 . 예를 들어
SELECT data->'images'->'thumbnail'->'url' AS thumb FROM instagram;
좋은 예와 자습서는 http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/ 을 참조 하십시오 .
답변
postgres 9.3에서는 객체 액세스에->를 사용하십시오. 4 예
seed.rb
se = SmartElement.new
se.data =
{
params:
[
{
type: 1,
code: 1,
value: 2012,
description: 'year of producction'
},
{
type: 1,
code: 2,
value: 30,
description: 'length'
}
]
}
se.save
레일 c
SELECT data->'params'->0 as data FROM smart_elements;
보고
data
----------------------------------------------------------------------
{"type":1,"code":1,"value":2012,"description":"year of producction"}
(1 row)
중첩을 계속할 수 있습니다
SELECT data->'params'->0->'type' as data FROM smart_elements;
반환
data
------
1
(1 row)