카테고리:

반정형 데이터 함수 (구문 분석)

TRY_PARSE_JSON

구문 분석 중 오류가 발생하면 NULL 값을 반환하는 PARSE_JSON 의 특수 버전입니다.

구문

TRY_PARSE_JSON( <expr> )

인자

expr

문자열 형식의 식입니다(예: VARCHAR).

반환

반환된 값은 VARIANT 형식이며 JSON 문서를 포함합니다.

사용법 노트

  • 이 함수는 압축된 최대 크기가 8MB인 입력 식을 지원합니다.

  • 입력이 NULL이면 출력도 NULL입니다. 그러나 입력 문자열이 'null' 인 경우, 결과가 SQL NULL이 아니라 null 을 포함하는 유효한 VARIANT 값이 되도록 JSON null 값으로 해석됩니다.

  • 10진수를 구문 분석할 때 이 함수는 123.45를 DOUBLE이 아닌 NUMBER(5,2)로 처리하여 표현의 정확성을 유지하려고 시도합니다. 그러나 과학적 표기법을 사용하는 숫자(예: 1.2345e+02)나, 범위 또는 스케일 제한으로 인해 고정 소수점 10진수로 저장할 수 없는 숫자는 DOUBLE로 저장됩니다. JSON은 기본적으로 TIMESTAMP, DATE, TIME 또는 BINARY와 같은 값을 나타내지 않으므로 문자열로 표현해야 합니다.

  • JSON에서 오브젝트(《사전》 또는 《해시》라고도 함)는 순서가 지정되지 않은 키-값 페어의 세트입니다. TO_JSONTRY_PARSE_JSON 은 (거의) 역 또는 상호 함수입니다.

    TRY_PARSE_JSON 함수는 문자열을 입력으로서 사용하고 JSON 호환 베리언트를 반환합니다. TO_JSON 함수는 JSON 호환 베리언트를 취하고 문자열을 반환합니다. X가 유효한 JSON을 포함하는 문자열인 경우, 다음은 (개념적으로) true입니다.

    X = TO_JSON(TRY_PARSE_JSON(X));

    예를 들어, 다음은 (개념적으로) true입니다.

    '{"pi":3.14,"e":2.71}' = TO_JSON(TRY_PARSE_JSON('{"pi":3.14,"e":2.71}'))

    그러나 다음 두 가지 이유로 이 함수는 완벽하게 상호적이지는 않습니다.

    • TO_JSON 에 의해 생성된 문자열의 키-값 페어의 순서는 예측할 수 없습니다.

    • TO_JSON 에 의해 생성된 문자열은 TRY_PARSE_JSON 에 전달된 문자열보다 공백이 적을 수 있습니다.

    다음은 동등한 JSON이지만, 동등한 문자열은 아닙니다.

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

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

다음은 JSON으로 구문 분석할 수 있는 값이 포함된 문자열을 구문 분석하기 위해 TRY_PARSE_JSON 을 호출하여 VARIANT 열에 다양한 형식의 데이터를 저장하는 예를 보여줍니다.

테이블을 만들고 채웁니다.

create or replace temporary table vartab (ID INTEGER, v VARCHAR);

insert into vartab (id, v) VALUES 
    (1, '[-1, 12, 289, 2188, false,]'), 
    (2, '{ "x" : "abc", "y" : false, "z": 10} '),
    (3, '{ "bad" : "json", "missing" : true, "close_brace": 10 ');

TRY_PARSE_JSON 을 사용하여 데이터를 쿼리합니다. 세 번째 줄의 값은 NULL입니다. 쿼리가 TRY_PARSE_JSON 대신 PARSE_JSON 을 사용했다면 쿼리가 실패했을 것입니다.

SELECT ID, try_parse_json(v) 
    FROM vartab
    ORDER BY ID;
+----+-------------------+
| ID | TRY_PARSE_JSON(V) |
|----+-------------------|
|  1 | [                 |
|    |   -1,             |
|    |   12,             |
|    |   289,            |
|    |   2188,           |
|    |   false,          |
|    |   undefined       |
|    | ]                 |
|  2 | {                 |
|    |   "x": "abc",     |
|    |   "y": false,     |
|    |   "z": 10         |
|    | }                 |
|  3 | NULL              |
+----+-------------------+
맨 위로 이동