PARSE_JSON

PARSE_JSON

입력 문자열을 JSON 문서로 해석해 VARIANT 값을 만들어내는 함수예요. JSON 형식의 데이터를 ARRAY나 OBJECT로 변환해 VARIANT 값에 바로 저장하고 싶을 때 씁니다.

출처: Snowflake SQL Reference

본문

PARSE_JSON( <expr> [ , '<parameter>' ] )

expr — 유효한 JSON 정보를 담은 문자열 타입(VARCHAR 등) 표현식이에요.

'parameter' — 일치 항목을 찾을 때 사용할 파라미터를 지정하는 문자열 상수예요.

Parameter Description
d JSON 객체의 중복 키를 허용. 중복 키가 있으면 해당 키에 마지막으로 지정된 값을 가진 단일 인스턴스로 반환
s JSON 객체의 중복 키를 허용하지 않음(strict). 기본값

JSON 문서를 담은 VARIANT 타입 값을 반환해요. 입력이 NULL이면 NULL을 반환해요. 이 함수는 구조화 타입(structured type)은 반환하지 않아요.

사용 메모

  • 최대 64MB(압축) 크기의 입력 표현식을 지원해요.
  • 빈 문자열이나 공백만 있는 문자열로 호출하면(빈 문자열은 유효한 JSON이 아님에도) 오류 대신 NULL을 반환해요. 일부 입력이 빈 문자열이어도 처리가 중단되지 않게 하려는 동작이에요.
  • 입력이 NULL이면 출력도 NULL이에요. 하지만 입력 문자열이 'null'이면 JSON null 값으로 해석되어 SQL NULL이 아니라 null을 담은 유효한 VARIANT가 돼요.
  • 소수 숫자를 파싱할 때 123.45를 DOUBLE이 아닌 NUMBER(5,2)로 취급해 표현의 정확성을 보존하려 해요. 다만 지수 표기(예: 1.2345e+02)나 범위·스케일 한계로 고정 소수점으로 저장할 수 없는 숫자는 DOUBLE로 저장돼요. JSON은 TIMESTAMP·DATE·TIME·BINARY를 기본적으로 표현하지 않으므로 이런 값은 문자열로 표현해야 해요.
  • TO_JSON과 PARSE_JSON은 (거의) 상반(reciprocal) 관계예요. PARSE_JSON은 문자열을 받아 JSON 호환 VARIANT를, TO_JSON은 JSON 호환 VARIANT를 받아 문자열을 반환해요. 하지만 완전히 상반되지는 않아서, 빈 문자열은 상호 처리되지 않고, TO_JSON이 만든 문자열의 키-값 순서나 공백도 예측할 수 없어요.

예시 — 다른 데이터 타입의 값을 VARIANT 컬럼에 저장:

CREATE OR REPLACE TABLE vartab (n NUMBER(2), v VARIANT);

INSERT INTO vartab
  SELECT column1 AS n, PARSE_JSON(column2) AS v
    FROM VALUES (1, 'null'),
                (2, null),
                (3, 'true'),
                (4, '-17'),
                (5, '123.12'),
                (6, '1.912e2'),
                (7, '"Om ara pa ca na dhih"  '),
                (8, '[-1, 12, 289, 2188, false,]'),
                (9, '{ "x" : "abc", "y" : false, "z": 10} ')
       AS vals;

기본적으로 중복 키를 넣으면 오류가 나요. d 파라미터를 지정하면 중복 키를 허용하고 마지막 값을 써요.

INSERT INTO vartab
SELECT column1 AS n, PARSE_JSON(column2, 'd') AS v
  FROM VALUES (10, '{ "a" : "123", "b" : "456", "a": "789"} ')
     AS vals;

더 알아보기 (Learn more)