최종 수정: 에
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]을 사용하는 식으로 지정할 수 있습니다.
- json_array의 마지막 요소를 가져오려면
*는 와일드카드를 나타내며,$.*는 루트 객체의 모든 멤버를,$[*]는 배열의 모든 요소를 나타냅니다.**는 '**'는 모든 경로(여러 단계의 하위 경로 포함)를 나타냅니다.
<path>에 와일드카드(*)가 포함되어 있으면 일치하는 결과는 배열 형태로 반환됩니다.<path>는 배열에 대해 자동으로 브로드캐스트하지 않습니다.<json_object>가 JSON 배열이고<path>가$.k이면 결과는 NULL입니다.$.k는 객체 멤버만 순회합니다. 인덱스로 요소를 지정하려면$[i].k를 사용하고, 배열의 모든 요소에서 필드를 추출하려면 와일드카드 구문$[*].k를 사용합니다. 이 구문은 Doris 4.0부터 지원됩니다.
예제
- 일반 매개변수
SELECT JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k1');
+-----------------------------------------------+
| JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k1') |
+-----------------------------------------------+
| "v31" |
+-----------------------------------------------+
참고: 반환 결과는
"v31"이며v31이 아닙니다.
-
NULL 매개변수
select JSON_EXTRACT(null, '$.k1');+----------------------------+
| JSON_EXTRACT(null, '$.k1') |
+----------------------------+
| NULL |
+----------------------------+ -
<path>가 NULL인 경우SELECT JSON_EXTRACT('{"k1":"v31","k2":300}', NULL);+---------------------------------------------+
| JSON_EXTRACT('{"k1":"v31","k2":300}', NULL) |
+---------------------------------------------+
| NULL |
+---------------------------------------------+ -
다단계 경로
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 |
+------------------------------------------------------------------------+ -
배열 경로
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" |
+----------------------------------------------------------------------+ -
존재하지 않는 경로
SELECT JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k3');+-----------------------------------------------+
| JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k3') |
+-----------------------------------------------+
| NULL |
+-----------------------------------------------+ -
여러 경로 매개변수
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 |
+------------------------------------------------------------------------------+ -
와일드카드 경로
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"] |
+---------------------------------------------------------------------------------------+ -
경로의 '**'
select json_extract('{"k": 123, "b": {"k": ["ab", "cd"]}}', '$**.k');+---------------------------------------------------------------+
| json_extract('{"k": 123, "b": {"k": ["ab", "cd"]}}', '$**.k') |
+---------------------------------------------------------------+
| [123,["ab","cd"]] |
+---------------------------------------------------------------+ -
값이 NULL인 경우
select JSON_EXTRACT('{"id": 123, "name": null}', '$.name') v, JSON_EXTRACT('{"id": 123, "name": null}', '$.name') is null v2;+------+------+
| v | v2 |
+------+------+
| null | 0 |
+------+------+ -
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"] |
+-------------+------------------+