본문으로 건너뛰기
최종 수정: 에

JSON_EXTRACT

설명​

JSON 타입 데이터에서 json_path로 지정한 필드를 추출합니다.

구문​

JSON_EXTRACT (<json_object>, <path>[, <path2>, ...])

매개변수​

매개변수설명
<json_object>필수. JSON 값 또는 JSON으로 변환할 수 있는 유효한 JSON 텍스트입니다.
<path>필수. STRING 타입의 JSON 경로입니다. 배열을 순회하려면 와일드카드를 명시적으로 사용해야 합니다.
<path2>, ...선택 사항. 추가 STRING 경로입니다. 일치하는 결과는 JSON 배열로 결합됩니다.

반환값​

SQL NULL은 인수 중 하나라도 NULL이거나 일치하는 경로가 없을 때 반환됩니다.

  • Nullable(JSON): <path>가 가리키는 JSON 요소를 반환합니다. 일치하는 결과가 여러 개이면 JSON 배열로 반환됩니다.

사용 시 참고 사항​

  • <json_object>가 NULL이거나 <path>가 NULL이면 NULL을 반환합니다.
  • 단일 <path> 매개변수를 사용하는 경우, <path>가 존재하지 않으면 NULL을 반환합니다.
  • 여러 <path> 매개변수를 사용하는 경우, 존재하지 않는 경로는 무시하고 일치하는 요소를 JSON 배열로 반환합니다. 일치하는 결과가 없으면 NULL을 반환합니다.
  • <path>가 유효한 경로가 아니면 오류가 발생합니다.
  • <path>에 해당하는 값이 문자열이면 반환되는 문자열은 큰따옴표(")로 둘러싸입니다. 큰따옴표가 없는 결과를 얻으려면 JSON_UNQUOTE 함수를 사용하세요.
  • <path>의 구문은 다음과 같습니다.
    • $는 JSON 루트를 나타냅니다.
    • .k1은 JSON 객체에서 키가 k1인 요소를 나타냅니다.
      • 키 값에 "."이 포함되어 있으면 <path>에 큰따옴표를 사용해야 합니다. 예: SELECT json_extract('{"k1.a":"abc","k2":300}', '$."k1.a"');
    • [i]는 JSON 배열에서 인덱스 i에 있는 요소를 나타냅니다.
      • json_array의 마지막 요소를 가져오려면 $[last]를, 끝에서 두 번째 요소를 가져오려면 $[last-1]을 사용하는 식으로 지정할 수 있습니다.
    • *는 와일드카드를 나타내며, $.*는 루트 객체의 모든 멤버를, $[*]는 배열의 모든 요소를 나타냅니다.
    • **는 '′와함께사용하며,′'와 함께 사용하며, '**'는 모든 경로(여러 단계의 하위 경로 포함)를 나타냅니다.
  • <path>에 와일드카드(*)가 포함되어 있으면 일치하는 결과는 배열 형태로 반환됩니다.
  • <path>는 배열에 대해 자동으로 브로드캐스트하지 않습니다. <json_object>가 JSON 배열이고 <path>가 $.k이면 결과는 NULL입니다. $.k는 객체 멤버만 순회합니다. 인덱스로 요소를 지정하려면 $[i].k를 사용하고, 배열의 모든 요소에서 필드를 추출하려면 와일드카드 구문 $[*].k를 사용합니다. 이 구문은 Doris 4.0부터 지원됩니다.

예제​

  1. 일반 매개변수
SELECT JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k1');
+-----------------------------------------------+
| JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k1') |
+-----------------------------------------------+
| "v31" |
+-----------------------------------------------+

참고: 반환 결과는 "v31"이며 v31이 아닙니다.

  1. NULL 매개변수

    select JSON_EXTRACT(null, '$.k1');
    +----------------------------+
    | JSON_EXTRACT(null, '$.k1') |
    +----------------------------+
    | NULL |
    +----------------------------+
  2. <path>가 NULL인 경우

    SELECT JSON_EXTRACT('{"k1":"v31","k2":300}', NULL);
    +---------------------------------------------+
    | JSON_EXTRACT('{"k1":"v31","k2":300}', NULL) |
    +---------------------------------------------+
    | NULL |
    +---------------------------------------------+
  3. 다단계 경로

    SELECT JSON_EXTRACT('{"k1":"v31","k2":{"sub_key": 1234.56}}', '$.k2.sub_key');
    +------------------------------------------------------------------------+
    | JSON_EXTRACT('{"k1":"v31","k2":{"sub_key": 1234.56}}', '$.k2.sub_key') |
    +------------------------------------------------------------------------+
    | 1234.56 |
    +------------------------------------------------------------------------+
  4. 배열 경로

    SELECT JSON_EXTRACT(json_array("abc", 123, cast(now() as string)), '$[2]');
    +----------------------------------------------------------------------+
    | JSON_EXTRACT(json_array("abc", 123, cast(now() as string)), '$[2]') |
    +----------------------------------------------------------------------+
    | "2025-07-16 18:35:25" |
    +----------------------------------------------------------------------+
  5. 존재하지 않는 경로

    SELECT JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k3');
    +-----------------------------------------------+
    | JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k3') |
    +-----------------------------------------------+
    | NULL |
    +-----------------------------------------------+
  6. 여러 경로 매개변수

    select JSON_EXTRACT('{"id": 123, "name": "doris"}', '$.name', '$.id', '$.not_exists');
    +--------------------------------------------------------------------------------+
    | JSON_EXTRACT('{"id": 123, "name": "doris"}', '$.name', '$.id', '$.not_exists') |
    +--------------------------------------------------------------------------------+
    | ["doris",123] |
    +--------------------------------------------------------------------------------+

    일치하는 결과가 하나뿐이어도 배열 형태로 반환됩니다.

    SELECT json_extract('{"id": 123, "name": "doris"}', '$.aaa', '$.name');
    +-----------------------------------------------------------------+
    | json_extract('{"id": 123, "name": "doris"}', '$.aaa', '$.name') |
    +-----------------------------------------------------------------+
    | ["doris"] |
    +-----------------------------------------------------------------+

    모든 경로에서 일치하는 결과가 없으면 NULL을 반환합니다.

    select JSON_EXTRACT('{"id": 123, "name": "doris"}', '$.k1', '$.k2', '$.not_exists');
    +------------------------------------------------------------------------------+
    | JSON_EXTRACT('{"id": 123, "name": "doris"}', '$.k1', '$.k2', '$.not_exists') |
    +------------------------------------------------------------------------------+
    | NULL |
    +------------------------------------------------------------------------------+
  7. 와일드카드 경로

    select json_extract('{"k": [1,2,3,4,5]}', '$.k[*]');
    +----------------------------------------------+
    | json_extract('{"k": [1,2,3,4,5]}', '$.k[*]') |
    +----------------------------------------------+
    | [1,2,3,4,5] |
    +----------------------------------------------+
    select json_extract('{"k": [1,2,3,4,5], "k2": "abc", "k3": {"k4": "v4"}}', '$.*', '$.k3.k4');
    +---------------------------------------------------------------------------------------+
    | json_extract('{"k": [1,2,3,4,5], "k2": "abc", "k3": {"k4": "v4"}}', '$.*', '$.k3.k4') |
    +---------------------------------------------------------------------------------------+
    | [[1,2,3,4,5],"abc",{"k4":"v4"},"v4"] |
    +---------------------------------------------------------------------------------------+
  8. 경로의 '**'

    select json_extract('{"k": 123, "b": {"k": ["ab", "cd"]}}', '$**.k');
    +---------------------------------------------------------------+
    | json_extract('{"k": 123, "b": {"k": ["ab", "cd"]}}', '$**.k') |
    +---------------------------------------------------------------+
    | [123,["ab","cd"]] |
    +---------------------------------------------------------------+
  9. 값이 NULL인 경우

    select JSON_EXTRACT('{"id": 123, "name": null}', '$.name') v, JSON_EXTRACT('{"id": 123, "name": null}', '$.name') is null v2;
    +------+------+
    | v | v2 |
    +------+------+
    | null | 0 |
    +------+------+
  10. JSON 배열의 각 요소에서 필드 추출(Doris 4.0+)

    select json_extract('[{"k":1},{"k":2},{"k":3}]', '$.k');
    +--------------------------------------------------+
    | json_extract('[{"k":1},{"k":2},{"k":3}]', '$.k') |
    +--------------------------------------------------+
    | NULL |
    +--------------------------------------------------+

    $.k는 배열을 순회하지 않고 객체 멤버에만 접근합니다.

    select json_extract('[{"k":1},{"k":2},{"k":3}]', '$[*].k');
    +-----------------------------------------------------+
    | json_extract('[{"k":1},{"k":2},{"k":3}]', '$[*].k') |
    +-----------------------------------------------------+
    | [1,2,3] |
    +-----------------------------------------------------+

    $[*].k를 사용하여 배열의 모든 요소에서 필드를 추출합니다.

배열 요소에서 동일한 필드 추출(Doris 4.0 이상)​

$[*].k1을 사용하여 배열 요소를 명시적으로 순회합니다. $.k1은 객체 멤버에만 접근하고 배열을 암시적으로 순회하지 않으므로 아래의 직접 경로는 SQL NULL을 반환합니다. k1이 없는 배열 요소는 일치 결과에서 제외됩니다.

SELECT json_extract('[{"k1":"v1"},{"k2":"v2"},{"k1":"v3"},{"k1":"v4"}]', '$.k1') AS direct_path,
json_extract('[{"k1":"v1"},{"k2":"v2"},{"k1":"v3"},{"k1":"v4"}]', '$[*].k1') AS all_values;
+-------------+------------------+
| direct_path | all_values |
+-------------+------------------+
| NULL | ["v1","v3","v4"] |
+-------------+------------------+