json 배열을 postgres 행으로 변환하는 방법
postgres 데이터베이스에 json 어레이가 저장되어 있습니다.json은 다음과 같습니다.
[
{
"operation": "U",
"taxCode": "1000",
"description": "iva description",
"tax": "12"
},
{
"operation": "U",
"taxCode": "1001",
"description": "iva description",
"tax": "12"
},
{
"operation": "U",
"taxCode": "1002",
"description": "iva description",
"tax": "12"
}
]
이제 나는SELECT
쿼리 결과의 다른 행에 요소가 배치되도록 배열합니다.그래서...SELECT
실행한 스테이트먼트는 다음과 같은 방법으로 데이터를 반환해야 합니다.
data
--------------------------------------------------------------------------------------
{ "operation": "U", "taxCode": "1000", "description": "iva description", "tax":"12"}
{ "operation": "U", "taxCode": "1001", "description": "iva description", "tax":"12"}
{ "operation": "U", "taxCode": "1002", "description": "iva description", "tax":"12"}
를 사용해 보았습니다.unnest()
기능.
SELECT unnest(json_data::json)
FROM my_table
하지만 이 방법은jsonb
유형.
저는 Poz가 원래 쓴 답을 댓글란에 올립니다.
unnest()
Postgre용SQL의 배열 유형.
대신 다음 기능 중 하나를 사용할 수 있습니다.
json_array_elements(json)
(9.3+)jsonb_array_elements(jsonb)
(9.4+)json[b]_array_elements_text(json[b])
(9.4+)
예:
select * from json_array_elements('[1,true, [2,false]]')
출력값
-------------
| 1 |
-------------
| true |
-------------
| [2,false] |
-------------
여기서 v9.4에 대한 매뉴얼을 찾을 수 있습니다.
더 어려운 예:
각각 jsonb 어레이를 포함하는 행이 있는 테이블이 있으며, 모든 어레이를 분할(또는 내스트 해제)하고 포함된 레코드에 대해 집계 계산을 수행한다고 가정합니다.
테이블(있는 그대로)categories
):
id | specifics (jsonb)
-----------------------------------------------------------------------------------
1 | [{"name": "Brand", "required": true}, {"name": "Color", "required": false}]
2 | [{"name": "Brand", "required": false}, {"name": "Color", "required": false}]
따라서 필요한 세부 사항 수를 계산하려면 다음과 같은 쿼리를 사용해야 합니다.
SELECT specs.name, COUNT(*) AS total
FROM
categories,
jsonb_to_recordset(categories.specifics) AS specs(name jsonb, required boolean)
WHERE
specs.required = TRUE
-- AND any other restrictions you need
GROUP BY specs.name
ORDER BY total DESC;
여기서FROM x, function(x.column)
모든 행을 효과적으로 결합하는 가로 방향 결합의 단축형입니다.categories
가상 테이블 생성jsonb_to_recordset
같은 행의 jsonb 배열에서 기능을 수행합니다.
결과는 다음과 같습니다.
name | total
---------------
Brand | 1
DB Fidle 링크: https://www.db-fiddle.com/f/c4xZcEgg9dsPVDtE7Keovv/0
이 경우 json_to_recordset 명령어를 사용하는 것이 좋습니다.SQL은 다음과 같습니다.
select *
from json_to_recordset('[{"operation":"U","taxCode":1000},{"operation":"U","taxCode":10001}]')
as x("operation" text, "taxCode" int);
출력은 다음과 같습니다.
------------------------
| |operation|taxCode |
------------------------
| 1 | "U" | 1000 |
------------------------
| 2 | "U" | 10001 |
------------------------
예의 열(또는 JSON 키)은 자유롭게 확장할 수 있습니다.
언급URL : https://stackoverflow.com/questions/36174881/how-to-turn-a-json-array-into-rows-in-postgres
'programing' 카테고리의 다른 글
Wordpress API: 게시물에 태그 추가/제거 (0) | 2023.03.22 |
---|---|
특정 스프링 프로필에서 플라이웨이를 비활성화하려면 어떻게 해야 합니까? (0) | 2023.03.22 |
중첩된 데이터 구조(예: JSON 구문 분석)에서 단일 값을 추출하려면 어떻게 해야 합니까? (0) | 2023.03.22 |
Oracle에서 FROM 절 없이 선택 (0) | 2023.03.22 |
메이븐 의존관계로서의 Oracle JDBC ojdbc6 Jar (0) | 2023.03.17 |