[PostgreSQL] 기존 데이터를 참조하여 INSERT

2024. 12. 7. 01:49·개발 (Development)/PostgreSQL

PostgreSQL: 기존 데이터를 참조하여 INSERT 문 작성하기

이번 포스팅에서는 PostgreSQL에서 기존 데이터를 참조해 새로운 데이터를 삽입하는 INSERT 문을 작성하는 방법을 알아보겠습니다. 특히 JSON 형식 데이터를 다룰 때 특정 값을 변환하여 새 컬럼에 저장하는 방법을 중심으로 설명합니다.

문제 상황

  • 테이블에 JSON 형식의 데이터를 가진 컬럼이 있습니다.
  • JSON 데이터 중 intervals 키의 첫 번째 배열 값을 가져온 뒤, 문자열을 / 기준으로 나누어 두 번째 값을 새로운 컬럼에 삽입하려고 합니다.

예제 테이블 구조

테이블 이름: example_table

컬럼 이름 데이터 타입 설명
id INTEGER 기본 키
data JSON JSON 형식 데이터
new_column TEXT 새로운 데이터 컬럼

SQL 문 작성

INSERT INTO example_table (id, data, new_column)
SELECT
    id, 
    data,
    split_part((data::json->'intervals'->>0)::text, '/', 2) AS new_column
FROM example_table
WHERE 조건;

SQL 문 설명

  1. data::json->'intervals'->>0
    • data 컬럼을 JSON으로 변환하고, intervals 키의 첫 번째 배열 값을 가져옵니다.
    • -> 연산자는 JSON 객체를 반환하고, ->> 연산자는 텍스트 값을 반환합니다.
  2. split_part(..., '/', 2)
    • PostgreSQL의 split_part 함수를 사용해 문자열을 / 기준으로 나누고, 두 번째 값을 가져옵니다.
    • 예를 들어, "2024/01/01" 문자열에서 split_part를 적용하면 01이 추출됩니다.
  3. INSERT INTO ... SELECT
    • 기존 데이터를 참조하여 새 데이터를 삽입하는 방식입니다.
    • SELECT 문으로 데이터를 가공한 결과를 INSERT를 통해 새로운 행으로 삽입합니다.
  4. WHERE 조건
    • 데이터 삽입 대상 행을 필터링하기 위해 WHERE 조건을 사용할 수 있습니다.
    • 예를 들어, 이미 처리된 데이터나 특정 조건을 만족하지 않는 데이터를 제외할 수 있습니다.

예제

기존 데이터

id data
1 {"intervals": ["2024/01/01", "2024/12/31"], "other_key": "value"}

실행 결과

id data new_column
1 {"intervals": ["2024/01/01", "2024/12/31"], "other_key": "value"} 01

주의사항

  1. JSON 배열 인덱스
    • PostgreSQL에서 JSON 배열은 0부터 시작합니다. 따라서 intervals 키의 첫 번째 배열 요소를 가져오려면 ->>0을 사용해야 합니다.
  2. 데이터 검증
    • 데이터가 JSON 형식이며, 배열이 존재하는지 검증하려면 아래와 같은 조건을 추가할 수 있습니다.
      WHERE jsonb_typeof(data::json->'intervals') = 'array'
  3. 데이터가 없을 경우 처리
    • JSON 배열이 비어 있거나 / 문자가 없는 경우, split_part 함수는 빈 문자열을 반환합니다. 이러한 경우를 처리하려면 CASE 문을 활용해 기본값을 설정할 수 있습니다.
      CASE 
          WHEN split_part((data::json->'intervals'->>0)::text, '/', 2) = '' THEN 'default_value'
          ELSE split_part((data::json->'intervals'->>0)::text, '/', 2)
      END
  4. 테이블 설계 확인
    • new_column은 이미 테이블에 존재해야 하며, 적절한 데이터 타입으로 설정되어 있어야 합니다. 예를 들어 TEXT 또는 VARCHAR 타입이어야 합니다.

마무리

PostgreSQL의 JSON 데이터 타입은 복잡한 데이터를 효율적으로 처리할 수 있는 강력한 도구입니다. INSERT INTO ... SELECT 구문을 활용하면 기존 데이터를 기반으로 새로운 데이터를 생성하는 작업도 간단히 수행할 수 있습니다.

이 포스팅이 도움이 되셨길 바라며, 추가적인 질문이나 다뤘으면 하는 내용이 있다면 댓글로 남겨주세요!

반응형

'개발 (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] 데이터 타입이 text 이고, JSON 문자열인 열의 값 수정  (1) 2024.12.07
'개발 (Development)/PostgreSQL' 카테고리의 다른 글
  • [PostgreSQL] 특정 값 비율 구하기
  • [PostgreSQL] duplicate key value violates unique constraint 에러가 데이터베이스에 미치는 영향
  • [PostgreSQL] PostgreSQL 훑어보기
  • [PostgreSQL] 데이터 타입이 text 이고, JSON 문자열인 열의 값 수정
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (231) N
      • 개발 (Development) (165) N
        • Algorithm (1)
        • Angular (1)
        • AWS (6)
        • DeepSeek (2)
        • Docker (7)
        • Git (3)
        • Java (34) N
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (7)
        • PostgreSQL (38)
        • Python (31)
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (11)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (11)
      • 기타 (Others) (3)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[PostgreSQL] 기존 데이터를 참조하여 INSERT
상단으로

티스토리툴바