TO_JSON

TO_JSON

VARIANT 값을 값의 JSON 표현을 포함한 문자열로 변환해요.

출처: Snowflake SQL Reference - TO_JSON

본문

구문

TO_JSON( expr )

인자

expr 유효한 JSON 정보를 담고 있는 VARIANT 타입의 표현식이에요.

반환 값

VARCHAR 타입의 값을 반환해요.

입력이 NULL이면 함수는 NULL을 반환해요.

사용 시 유의사항

  • 입력이 NULL이면 출력도 NULL이에요. 입력이 JSON null을 포함한 VARIANT이면 반환 값은 문자열 null(즉 큰따옴표로 둘러싸인 단어 “null”)이에요. 아래 예시를 참고하세요.
  • JSON 객체(“dictionary” 또는 “hash”라고도 함)는 순서가 없는 키-값 쌍의 집합이에요. TO_JSON이 문자열을 만들 때 그 문자열에서 키-값 쌍의 순서는 예측할 수 없어요.
  • TO_JSON과 PARSE_JSON은 (거의) 역(逆) 함수, 즉 상호 함수예요.
    • PARSE_JSON 함수는 문자열을 입력으로 받아 JSON 호환 VARIANT를 반환해요.
    • TO_JSON 함수는 JSON 호환 VARIANT를 받아 문자열을 반환해요.
  • 다음은 X가 유효한 JSON을 포함한 문자열일 때 (개념적으로) 참이에요:
X = TO_JSON(PARSE_JSON(X));

예를 들어 다음은 (개념적으로) 참이에요:

{pi:3.14,e:2.71} = TO_JSON(PARSE_JSON({pi:3.14,e:2.71}))
  • 그러나 함수들은 완벽히 역이 되지는 않아요. 왜냐하면:
    • 빈 문자열과 공백만 있는 문자열은 역으로 처리되지 않아요. 예를 들어 PARSE_JSON()의 반환 값은 NULL이지만 TO_JSON(NULL)의 반환 값은 NULL이며 역이 아니에요.
    • TO_JSON이 만든 문자열에서 키-값 쌍의 순서는 예측할 수 없어요.
    • TO_JSON이 만든 문자열은 PARSE_JSON에 전달된 문자열보다 공백이 적을 수 있어요.

예를 들어 다음은 동등한 JSON이지만 동등한 문자열은 아니에요:

  • {pi: 3.14, e: 2.71}
  • {e:2.71,pi:3.14}

예시

다음 예시들은 TO_JSON 함수를 사용해요.

VARIANT 값 삽입 및 쿼리로 문자열 변환

테이블을 만들고 채워요. INSERT 문은 PARSE_JSON 함수를 사용하여 테이블의 v 컬럼에 VARIANT 값을 삽입해요.

CREATE OR REPLACE TABLE jdemo1 (v VARIANT);
INSERT INTO jdemo1 SELECT PARSE_JSON({food:bard});

데이터를 쿼리하고 TO_JSON 함수를 사용하여 VARIANT 값을 문자열로 변환해요.

SELECT v, v:food, TO_JSON(v) FROM jdemo1;
+------------------+--------+-----------------+
| V                | V:FOOD | TO_JSON(V)      |
|------------------+--------+-----------------|
| {                | bard   | {food:bard}     |
|   food: bard     |        |                 |
| }                |        |                 |
+------------------+--------+-----------------+

PARSE_JSON 및 TO_JSON 함수로 NULL 값 처리

다음 예시는 PARSE_JSON과 TO_JSON이 NULL 값을 어떻게 처리하는지 보여줘요:

SELECT TO_JSON(NULL), TO_JSON(null::VARIANT),
       PARSE_JSON(NULL), PARSE_JSON(null);
+---------------+--------------------------+------------------+--------------------+
| TO_JSON(NULL) | TO_JSON(NULL::VARIANT)  | PARSE_JSON(NULL) | PARSE_JSON(NULL)  |
|---------------+--------------------------+------------------+--------------------|
| NULL          | null                    | NULL             | null              |
+---------------+--------------------------+------------------+--------------------+

PARSE_JSON과 TO_JSON 비교

다음 예시들은 PARSE_JSON 함수와 TO_JSON 함수의 관계를 보여줘요.

이 예시는 VARCHAR 컬럼과 VARIANT 컬럼을 가진 테이블을 만들어요. INSERT 문은 VARCHAR 값을 삽입하고, UPDATE 문은 그 VARCHAR 값에 대응하는 JSON 값을 생성해요.

CREATE OR REPLACE TABLE jdemo2 (
  varchar1 VARCHAR,
  variant1 VARIANT);

INSERT INTO jdemo2 (varchar1) VALUES ({PI:3.14});

UPDATE jdemo2 SET variant1 = PARSE_JSON(varchar1);

이 쿼리는 TO_JSON과 PARSE_JSON이 개념적으로 역함수임을 보여줘요:

SELECT varchar1,
       PARSE_JSON(varchar1),
       variant1,
       TO_JSON(variant1),
       PARSE_JSON(varchar1) = variant1,
       TO_JSON(variant1) = varchar1
  FROM jdemo2;
+-------------+----------------------+--------------+-------------------+---------------------------------+------------------------------+
| VARCHAR1    | PARSE_JSON(VARCHAR1) | VARIANT1     | TO_JSON(VARIANT1) | PARSE_JSON(VARCHAR1) = VARIANT1 | TO_JSON(VARIANT1) = VARCHAR1 |
|-------------+----------------------+--------------+-------------------+---------------------------------+------------------------------|
| {PI:3.14}   | {                    | {            | {PI:3.14}         | True                            | True                         |
|             |   PI: 3.14           |   PI: 3.14   |                   |                                 |                              |
|             | }                    | }            |                   |                                 |                              |
+-------------+----------------------+--------------+-------------------+---------------------------------+------------------------------+

그러나 함수들은 정확히 역이지는 않아요. 공백이나 키-값 쌍 순서의 차이가 출력이 입력과 일치하는 것을 막을 수 있어요. 예를 들어:

SELECT TO_JSON(PARSE_JSON({b:1,a:2})),
       TO_JSON(PARSE_JSON({b:1,a:2})) = {b:1,a:2},
       TO_JSON(PARSE_JSON({b:1,a:2})) = {a:2,b:1};
+--------------------------------------+--------------------------------------------------------+--------------------------------------------------------+
| TO_JSON(PARSE_JSON({B:1,A:2}))       | TO_JSON(PARSE_JSON({B:1,A:2})) = {B:1,A:2}            | TO_JSON(PARSE_JSON({B:1,A:2})) = {A:2,B:1}             |
|--------------------------------------+--------------------------------------------------------+--------------------------------------------------------|
| {a:2,b:1}                            | False                                                  | True                                                   |
+--------------------------------------+--------------------------------------------------------+--------------------------------------------------------+

더 알아보기 (Learn more)

  • PARSE_JSON — 문자열을 JSON VARIANT로 변환