JSON_EACH 함수

2022. 6. 8.·Oracle/JSON

개요

PostgreSQL의 JSON_EACH 함수는 key-value로 구성된 JSON 오브젝트를 로우 형식으로 반환합니다. Oracle Database는 JSON_EACH 함수를 제공하지 않아 PL/SQL 함수를 통해 JSON_EACH 함수 기능을 구현해야 합니다.

 

PostgreSQL

테스트를 위해 아래와 같이 테이블을 생성하겠습니다.

-- 1
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (c1 JSON);
INSERT INTO t1 VALUES ('{"A":1,"B":2}');
COMMIT;

 

JSON_EACH 함수는 아래와 같이 동작합니다.

-- 2
SELECT b.key, b.value FROM t1 a, JSON_EACH (a.c1) b;

 key | value
-----+-------
 A   |     1
 B   |     2

(2 rows)

 

Oracle Database

테스트를 위해 아래와 같이 테이블을 생성하겠습니다.

-- 3
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1 VARCHAR2(4000));

INSERT INTO t1 VALUES ('{"A":1,"B":2}');
COMMIT;

 

아래 fnc_json_obj_to_arr 함수는 JSON 오브젝트를 JSON 배열로 변환합니다.

-- 4
CREATE OR REPLACE FUNCTION fnc_json_obj_to_arr (i_value IN VARCHAR2)
    RETURN VARCHAR2
IS
    v_json_object JSON_OBJECT_T := JSON_OBJECT_T (i_value);
    v_json_key    JSON_KEY_LIST := v_json_object.GET_KEYS;
    v_buffer      JSON_ARRAY_T  := JSON_ARRAY_T ();
    v_result      JSON_ARRAY_T  := JSON_ARRAY_T ();
BEGIN
    FOR i in 1 .. v_json_key.COUNT LOOP
        v_buffer := JSON_ARRAY_T ();
        v_buffer.APPEND (v_json_key(i));
        v_buffer.APPEND (v_json_object.GET_STRING(v_json_key(i)));
        v_result.APPEND (v_buffer);
    END LOOP;

    RETURN v_result.STRINGIFY;
END;
/

 

아래는 fnc_json_obj_to_arr 함수를 사용한 결과입니다.

-- 5
SELECT c1, fnc_json_obj_to_arr (c1) AS json_obj_to_arr FROM t1;

C1            JSON_OBJ_TO_ARR
------------- ---------------------
{"A":1,"B":2} [["A","1"],["B","2"]]

1개의 행이 선택되었습니다.

 

fnc_json_obj_to_arr 함수와 JSON_TABLE 표현식을 사용하면 PostgreSQL의 JSON_EACH 함수와 동일한 결과를 얻을 수 있습니다.

-- 6
SELECT b.key, b.value
  FROM t1 a
     , JSON_TABLE (fnc_json_obj_to_arr (a.c1)
                 , '$[*]' COLUMNS (
                       key   VARCHAR2(4000) PATH '$[0]'
                     , value NUMBER         PATH '$[1]')) b;

KEY VALUE
--- -----
A       1
B       2

2 행이 선택되었습니다.
저작자표시 비영리 변경금지 (새창열림)
'Oracle/JSON' 카테고리의 다른 글
  • JSON_TRANSFORM 함수 기능 개선
  • JSON PASSING 절 개선
  • CSV to JSON Array
  • Unnest JSON Array
정희락
정희락
2007년부터 Oracle Database 성능 최적화에 주력해 왔으며, 현재 한국오라클 Engineered Systems Solution Engineering 팀에서 Solution Engineer로 근무하고 있습니다. 이 블로그는 개인적인 연구 목적으로 운영되며, Oracle 사의 공식 입장을 대변하지 않습니다.
  • 정희락
    TunA
    정희락
  • 전체
    오늘
    어제
    • 분류 전체보기 (194)
      • Oracle (166)
        • SQL (32)
        • PLSQL (10)
        • Performance (72)
        • Administration (36)
        • Installation (3)
        • Utilities (1)
        • JSON (8)
        • Vector (4)
      • Exadata (15)
      • SQL*Plus (2)
      • Linux (5)
      • Resources (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 도서

    • 불친절한 SQL 프로그래밍
    • 불친절한 PL/SQL 프로그래밍
  • 링크

    • Connor McDonald
    • Frits Hoogland
    • Jonathan Lewis
    • Julian Dontcheff
    • Julian Dyke
    • Kun Sun
    • Maria Colgan
    • Martin Bach
    • Mike Dietrich
    • Tanel Poder
  • 공지사항

  • 인기 글

  • 태그

    12c
    19c
    21c
    23ai
    case study
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
정희락
JSON_EACH 함수
상단으로

티스토리툴바