[PostgreSQL] 데이터 타입이 text 이고, JSON 문자열인 열의 값 수정

2024. 12. 7. 02:11·개발 (Development)/PostgreSQL

PostgreSQL에서 JSON 문자열의 특정 값을 수정하는 방법

PostgreSQL에서 JSON 형태의 데이터를 문자열로 저장하고 있을 때, 특정 값을 업데이트하려면 문자열 데이터를 JSON으로 변환하여 수정한 뒤 다시 문자열로 변환해야 합니다. 아래는 JSON 문자열에서 upperLimit 또는 lowerLimit 값을 수정하는 방법을 설명합니다.


문제 상황

컬럼에 아래와 같은 JSON 문자열이 저장되어 있다고 가정합니다:

{
  "type": "default",
  "type": "default",
  "spec": {
    "upperLimit": 4.0,
    "lowerLimit": 0.0
  }
}

여기에서:

  • upperLimit 값을 기존 값과 상관없이 새 값으로 수정하고 싶습니다.
  • 또는 lowerLimit 값을 기존 값과 상관없이 새 값으로 수정하고 싶습니다.

해결 방법

PostgreSQL에서는 jsonb_set 함수를 사용하여 JSON 데이터를 수정할 수 있습니다. 하지만 문자열 데이터는 json이나 jsonb 타입으로 변환한 뒤 수정해야 합니다. 수정 후 다시 문자열로 변환하여 저장합니다.


예제 쿼리

lowerLimit 값을 수정

lowerLimit 값을 1.0으로 수정하는 쿼리는 아래와 같습니다:

UPDATE your_table
SET json_column = jsonb_set(json_column::jsonb, '{spec,lowerLimit}', '1.0'::jsonb)::text
WHERE json_column::jsonb ? 'spec';

upperLimit 값을 수정

upperLimit 값을 5.0으로 수정하는 쿼리는 아래와 같습니다:

UPDATE your_table
SET json_column = jsonb_set(json_column::jsonb, '{spec,upperLimit}', '5.0'::jsonb)::text
WHERE json_column::jsonb ? 'spec';

lowerLimit과 upperLimit을 동시에 수정

lowerLimit 값을 1.0으로, upperLimit 값을 5.0으로 동시에 수정하려면 jsonb_set 함수를 중첩 사용합니다:

UPDATE your_table
SET json_column = jsonb_set(
                    jsonb_set(json_column::jsonb, '{spec,lowerLimit}', '1.0'::jsonb),
                    '{spec,upperLimit}', '5.0'::jsonb
                 )::text
WHERE json_column::jsonb ? 'spec';

쿼리 설명

  1. json_column::jsonb
    문자열 데이터를 jsonb 타입으로 변환합니다.
  2. jsonb_set 함수
    JSON 데이터의 특정 키를 업데이트합니다.
    • 첫 번째 인자는 수정할 JSON 데이터입니다.
    • 두 번째 인자는 수정할 키의 경로 (예: '{spec,lowerLimit}').
    • 세 번째 인자는 새로운 값 ('1.0'::jsonb).
  3. ::text
    수정된 JSON 데이터를 다시 문자열로 변환하여 저장합니다.
  4. WHERE json_column::jsonb ? 'spec'
    JSON 데이터에서 spec 키가 존재하는 행만 업데이트합니다.

참고 사항

  1. 데이터 타입 관리
    JSON 데이터를 문자열로 저장하지 말고, 가능하면 jsonb 타입 컬럼으로 변환하여 사용하는 것을 권장합니다. 이를 위해 아래와 같이 컬럼을 변경할 수 있습니다:
  2. ALTER TABLE your_table ALTER COLUMN json_column TYPE jsonb USING json_column::jsonb;
  3. 유효성 검사
    JSON 문자열에 유효하지 않은 값이 포함된 경우 변환 중 오류가 발생할 수 있으므로, 업데이트 전에 데이터의 유효성을 확인해야 합니다.
  4. 성능 최적화
    jsonb 타입은 JSON 데이터를 효율적으로 처리하도록 설계되었습니다. 문자열 데이터를 변환하는 작업은 비용이 크므로, 데이터가 크거나 자주 업데이트가 필요한 경우 성능에 주의하세요.
반응형

'개발 (Development) > PostgreSQL' 카테고리의 다른 글

[PostgreSQL/TimescaleDB] Reordering chunk  (0) 2024.12.29
[PostgreSQL] 특정 값 비율 구하기  (0) 2024.12.29
[PostgreSQL] duplicate key value violates unique constraint 에러가 데이터베이스에 미치는 영향  (1) 2024.12.15
[PostgreSQL] PostgreSQL 훑어보기  (3) 2024.12.07
[PostgreSQL] 기존 데이터를 참조하여 INSERT  (0) 2024.12.07
'개발 (Development)/PostgreSQL' 카테고리의 다른 글
  • [PostgreSQL] 특정 값 비율 구하기
  • [PostgreSQL] duplicate key value violates unique constraint 에러가 데이터베이스에 미치는 영향
  • [PostgreSQL] PostgreSQL 훑어보기
  • [PostgreSQL] 기존 데이터를 참조하여 INSERT
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (216)
      • 개발 (Development) (151)
        • Algorithm (1)
        • Angular (1)
        • AWS (4)
        • DeepSeek (2)
        • Docker (7)
        • Git (3)
        • Java (30)
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (6)
        • PostgreSQL (37)
        • Python (26)
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (10)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (10)
      • 기타 (Others) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    typescript
    백준알고리즘
    PostgreSQL
    docker
    오답노트
    Kafka
    javascript
    springboot
    Kubernetes
    백준
    pandas
    java
    백준자바
    데이터분석
    AWS
    Linux master
    Vue.js
    deepseek
    ADsP
    JSON
    DevOps
    Linux
    리눅스 마스터 2급 2차
    python
    백준온라인저지
    timescaledb
    자바
    리눅스 마스터 2급
    JPA
    MyBatis
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[PostgreSQL] 데이터 타입이 text 이고, JSON 문자열인 열의 값 수정
상단으로

티스토리툴바