- 카테고리:
반정형 및 정형 데이터 함수 (구문 분석)
PARSE_JSON¶
입력 문자열을 JSON 문서로 해석하여 VARIANT 값을 생성합니다.
- 참고 항목:
구문¶
PARSE_JSON( <expr> )
인자¶
expr
유효한 JSON 정보를 보유하는 문자열 형식(예: VARCHAR)의 식입니다.
반환¶
반환된 값은 VARIANT
형식이며 JSON 문서를 포함합니다.
이 함수는 정형 유형 을 반환하지 않습니다.
사용법 노트¶
이 함수는 압축된 최대 크기가 8MB인 입력 식을 지원합니다.
PARSE_JSON 함수가 빈 문자열로 호출되거나 공백 문자만 포함하는 문자열로 호출되는 경우에는 빈 문자열이 유효한 JSON이 아니더라도 함수에서 오류를 발생시키지 않고 NULL을 반환합니다. 이를 통해 일부 입력이 빈 문자열인 경우 중단하지 않고 계속 처리할 수 있습니다.
입력이 NULL이면 출력도 NULL입니다. 그러나 입력 문자열이
'null'
인 경우, 결과가 SQL NULL이 아니라null
을 포함하는 유효한 VARIANT 값이 되도록 JSON null 값으로 해석됩니다. 아래의 예 섹션에 예가 포함되어 있습니다.10진수를 구문 분석할 때 PARSE_JSON은 123.45를 DOUBLE이 아닌 NUMBER(5,2)로 처리하여 표현의 정확성을 유지하려고 시도합니다. 그러나 과학적 표기법을 사용하는 숫자(예: 1.2345e+02)나, 범위 또는 스케일 제한으로 인해 고정 소수점 10진수로 저장할 수 없는 숫자는 DOUBLE로 저장됩니다. JSON은 기본적으로 TIMESTAMP, DATE, TIME 또는 BINARY와 같은 값을 나타내지 않으므로 문자열로 표현해야 합니다.
JSON에서 오브젝트(“사전” 또는 “해시”라고도 함)는 순서가 지정되지 않은 키-값 페어의 세트입니다.
TO_JSON
및PARSE_JSON
은 (거의) 역 또는 상호 함수입니다.PARSE_JSON
함수는 문자열을 입력값으로 받아 JSON 호환 VARIANT 를 반환합니다.TO_JSON
함수는 JSON 호환 VARIANT를 받아 문자열을 반환합니다.
X가 유효한 JSON을 포함하는 문자열인 경우, 다음은 (개념적으로) true입니다.
X = TO_JSON(PARSE_JSON(X));
예를 들어, 다음은 (개념적으로) true입니다.
'{"pi":3.14,"e":2.71}' = TO_JSON(PARSE_JSON('{"pi":3.14,"e":2.71}'))
그러나 다음과 같은 이유로 이 함수는 완벽하게 상호적이지는 않습니다.
빈 문자열과 공백만 있는 문자열은 상호적으로 처리되지 않습니다. 예를 들어
PARSE_JSON('')
의 반환 값은 NULL이지만,TO_JSON(NULL)
의 반환 값은''
가 아닙니다.TO_JSON
에 의해 생성된 문자열의 키-값 페어의 순서는 예측할 수 없습니다.TO_JSON
에 의해 생성된 문자열은PARSE_JSON
에 전달된 문자열보다 공백이 적을 수 있습니다.
예를 들어 다음은 동등한 JSON이지만, 동등한 문자열은 아닙니다.
{"pi": 3.14, "e": 2.71}
{"e":2.71,"pi":3.14}
예¶
이는 문자열을 구문 분석하기 위해 PARSE_JSON
을 호출함으로써 VARIANT 열에 다양한 형식의 데이터를 저장하는 예를 보여줍니다.
테이블을 만들고 채웁니다.
INSERT
문은PARSE_JSON
함수를 사용합니다.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;데이터를 쿼리합니다.
SELECT n, v, TYPEOF(v) FROM vartab ORDER BY n;
다음 예는 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
, TO_VARIANT
간의 관계를 보여줍니다.
테이블을 만들고 VARCHAR 일반 VARIANT, JSON 호환 VARIANT 데이터를 추가합니다. INSERT 문은 VARCHAR 값을 삽입하고, UPDATE 문은 그 VARCHAR에 해당하는 JSON 값을 생성합니다.
CREATE or replace TABLE jdemo2 (varchar1 VARCHAR, variant1 VARIANT, variant2 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 | +--------------------------------------+--------------------------------------------------------+--------------------------------------------------------+
PARSE_JSON
및TO_VARIANT
모두 문자열을 사용하여 베리언트를 반환할 수 있지만, 동등하지는 않습니다. 다음 코드는PARSE_JSON
을 사용하여 한 열을 업데이트하고TO_VARIANT
를 사용하여 다른 열을 업데이트합니다. (열variant1
에 대한 업데이트는 동일한 함수 호출을 사용하여 이전에 업데이트되었기 때문에 필요하지 않습니다. 그러나 아래 코드는 열을 업데이트하기 위해 호출되는 함수를 나란히 볼 수 있도록 다시 업데이트합니다.)UPDATE jdemo2 SET variant1 = PARSE_JSON(varchar1), variant2 = TO_VARIANT(varchar1);아래 쿼리는
PARSE_JSON
의 출력과TO_VARIANT
의 출력이 동일하지 않음을 보여줍니다. 공백의 사소한 차이 외에, 따옴표에도 상당한 차이가 있습니다.SELECT variant1, variant2, variant1 = variant2 FROM jdemo2; +--------------+-----------------+---------------------+ | VARIANT1 | VARIANT2 | VARIANT1 = VARIANT2 | |--------------+-----------------+---------------------| | { | "{\"PI\":3.14}" | False | | "PI": 3.14 | | | | } | | | +--------------+-----------------+---------------------+