source

Postgres의 json 개체에서 키, 값 추출

myloves 2023. 3. 4. 15:28

Postgres의 json 개체에서 키, 값 추출

Postgres 테이블에는 다음과 같은 내용이 있습니다.

id  | data

1   | {"a":"4", "b":"5"}
2   | {"a":"6", "b":"7"}
3   | {"a":"8", "b":"9"}

첫 번째 열은 정수이고 두 번째 열은 json 열입니다.

json에서 키와 값을 확장하여 다음과 같은 결과를 얻을 수 있기를 원합니다.

id  | key  | value

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

Postgres SQL에서 이를 실현할 수 있습니까?


내가 시도한 것

원래 테이블은 다음과 같이 시뮬레이션할 수 있습니다.

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은 이것보다 훨씬 더 중첩되어 있지만, 이 예는 저의 근본적인 문제를 잘 나타내고 있다고 생각합니다.

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

함수json_each_text()는 집합 반환 함수이므로 행 소스로 사용해야 합니다.함수의 출력은 여기서 테이블에 측면으로 결합됩니다.q즉, 테이블 내의 각 행에 대해(key, value)에서 짝을 짓다data열은 해당 행에만 결합되므로 원래 행과 행의 관계는json오브젝트는 유지됩니다.

테이블q또한 매우 복잡한 하위 항목일 수도 있습니다(또는VALUES절을 참조해 주세요.함수에서는 해당 서브쿼리의 평가 결과에서 적절한 열이 사용되므로 서브쿼리의 에일리어스와 서브쿼리의 (에일리어스) 컬럼에 대한 참조만 사용합니다.

이렇게 하면 다음과 같은 문제가 해결됩니다.

select you_table.id , js.key, js.value
from you_table, json_each(you_table.data) as js

가입할 json이 여러 개 있을 때 작업하기 매우 쉬운 또 다른 방법은 다음과 같습니다.

SELECT data -> 'key'   AS key, 
       data -> 'value' AS value 
FROM   (SELECT Hstore(Json_each_text(data)) AS data 
        FROM   "your_table") t;

넌 할 수 있다.

select js.key , js.value 
from metadata, json_each(metadata.column_metadata) as js 
where id='6eec';

언급URL : https://stackoverflow.com/questions/39010601/extract-key-value-from-json-objects-in-postgres