JSON 유형 내의 어레이 요소를 쿼리합니다.
테스트하는 중입니다json
Postgre를 입력하다SQL 9.3.
나는 가지고 있다json
라고 하는 컬럼data
라는 테이블에서reports
JSON은 다음과 같습니다.
{
"objects": [
{"src":"foo.png"},
{"src":"bar.png"}
],
"background":"background.png"
}
'objects' 배열의 'src' 값과 일치하는 모든 보고서에 대해 테이블을 쿼리하고 싶습니다.예를 들어 일치하는 모든 보고서에 대해 DB를 조회할 수 있습니까?'src' = 'foo.png'
? 에 일치할 수 있는 쿼리를 성공적으로 작성했습니다."background"
:
SELECT data AS data FROM reports where data->>'background' = 'background.png'
하지만 그 이후로는"objects"
가치관이 너무 많아서 쓸 수 없는 것 같아요.일치하는 모든 보고서에 대해 DB를 쿼리할 수 있습니까?'src' = 'foo.png'
다음 출처를 조사했는데도 알 수 없습니다.
- http://www.postgresql.org/docs/9.3/static/functions-json.html
- 새 Postgre 내의 필드를 사용하여 쿼리하려면 어떻게 해야 합니까?SQL JSON 데이터형?
- http://michael.otacoo.com/postgresql-2/postgres-9-3-feature-highlight-json-operators/
저도 이런 시도를 해봤지만 소용이 없었습니다.
SELECT json_array_elements(data->'objects') AS data from reports
WHERE data->>'src' = 'foo.png';
저는 SQL 전문가가 아니기 때문에 무엇을 잘못하고 있는지 모르겠습니다.
jsonb
Postgres 9.4 이상
에서만 다음과 같은 쿼리를 사용할 수 있습니다.
하지만 그보다는jsonb
"오퍼레이터" 연산자@>
식에 일치하는 GIN 인덱스와 조합하여data->'objects'
:
CREATE INDEX reports_data_gin_idx ON reports
USING gin ((data->'objects') jsonb_path_ops);
SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';
열쇠부터objects
는 JSON 배열을 보유하고 있습니다.검색어의 구조를 일치시키고 배열 요소도 대괄호로 묶어야 합니다.플레인 레코드를 검색할 때는 어레이 브래킷을 놓습니다.
자세한 설명 및 옵션:
json
Postgres 9.3 이상
JSON 어레이를 분리하여 가로 방향 결합으로 기능합니다.FROM
절 및 해당 요소에 대한 테스트:
SELECT data::text, obj
FROM reports r, json_array_elements(r.data#>'{objects}') obj
WHERE obj->>'src' = 'foo.png';
또는 단일 수준의 중첩에 대해서만 해당됩니다.
SELECT *
FROM reports r, json_array_elements(r.data->'objects') obj
WHERE obj->>'src' = 'foo.png';
->>
,->
그리고.#>
조작자는 매뉴얼에 설명되어 있습니다.
두 쿼리는 모두 암묵적으로JOIN LATERAL
.
밀접한 관련:
json 유형으로 열이 있는 테이블을 생성합니다.
CREATE TABLE friends ( id serial primary key, data jsonb);
이제 json 데이터를 삽입하겠습니다.
INSERT INTO friends(data) VALUES ('{"name": "Arya", "work": ["Improvements", "Office"], "available": true}');
INSERT INTO friends(data) VALUES ('{"name": "Tim Cook", "work": ["Cook", "ceo", "Play"], "uses": ["baseball", "laptop"], "available": false}');
이제 데이터를 가져오기 위한 쿼리를 몇 가지 만들어 보겠습니다.
select data->'name' from friends;
select data->'name' as name, data->'work' as work from friends;
결과에는 반전 콤마(" )와 괄호([ ])가 붙어 있는 것을 알 수 있습니다.
name | work
------------+----------------------------
"Arya" | ["Improvements", "Office"]
"Tim Cook" | ["Cook", "ceo", "Play"]
(2 rows)
사용만 하는 값만 검색하려면->>
select data->>'name' as name, data->'work'->>0 as work from friends;
select data->>'name' as name, data->'work'->>0 as work from friends where data->>'name'='Arya';
언급URL : https://stackoverflow.com/questions/22736742/query-for-array-elements-inside-json-type
'programing' 카테고리의 다른 글
Angular UI 라우터가 비동기/대기 기능을 사용할 때 해결 기능을 처리하지 않습니까? (0) | 2023.03.02 |
---|---|
user_id만 사용하여 Wordpress에 로그인하는 방법 (0) | 2023.03.02 |
각도에서의 $timeout not defined 오류JS 앱 (0) | 2023.03.02 |
스파게티 코드의 특징은 무엇입니까? (0) | 2023.03.02 |
AngularJS가 컨트롤러에서 서비스의 객체 값 변경을 트리거하고 감시합니다. (0) | 2023.03.02 |