programing

json 배열을 postgres 행으로 변환하는 방법

muds 2023. 3. 22. 22:14
반응형

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

반응형