JSON_EXTRACT
デスクリプション
JSON型のデータから、json_pathで指定されたフィールドを抽出します。
Syntax
JSON_EXTRACT (<json_object>, <path>[, <path2>, ...])
パラメータ
Required パラメータ:
<json_object>: 抽出元のJSON型式。<path>: 対象JSONから対象要素を抽出するためのJSONパス。
Optional/Variable パラメータ
<path2>JSONオブジェクトから複数のパス値を抽出できます。
Return Value
Nullable(JSON):<path>が指すJSON要素を返します。複数の結果がマッチした場合、JSON配列として返されます。
Usage 注釈
<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]を使用でき、最後から2番目の要素には$[last-1]を使用できます。
- json_arrayの最後の要素を取得するには
*はワイルドカードを表し、$.*はルートオブジェクトのすべてのメンバーを、$[*]は配列のすべての要素を表します。**は'$'と組み合わせて使用され、'$**'はすべてのパス(多層サブパスを含む)を表します。
<path>にワイルドカード(*)が含まれる場合、マッチング結果は配列形式で返されます。
Examples
- General parameters
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] |
+--------------------------------------------------------------------------------+
一致するものが1つしかない場合でも、配列形式で返されます
```sql
select JSON_EXTRACT('{"id": 123, "name": "doris"}', '$.name', '$.id2', '$.not_exists');
```
```
+---------------------------------------------------------------------------------+
| JSON_EXTRACT('{"id": 123, "name": "doris"}', '$.name', '$.id2', '$.not_exists') |
+---------------------------------------------------------------------------------+
| ["doris"] |
+---------------------------------------------------------------------------------+
```
すべてのパスに一致するものがない場合は、NULLを返します
```sql
select JSON_EXTRACT('{"id": 123, "name": "doris"}', '$.k1', '$.k2', '$.not_exists');
```
```
+------------------------------------------------------------------------------+
| JSON_EXTRACT('{"id": 123, "name": "doris"}', '$.k1', '$.k2', '$.not_exists') |
+------------------------------------------------------------------------------+
| NULL |
+------------------------------------------------------------------------------+
```
8. ワイルドカードパス
```sql
select json_extract('{"k": [1,2,3,4,5]}', '$.k[*]');
```
```
+----------------------------------------------+
| json_extract('{"k": [1,2,3,4,5]}', '$.k[*]') |
+----------------------------------------------+
| [1,2,3,4,5] |
+----------------------------------------------+
```
```sql
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"] |
+---------------------------------------------------------------------------------------+
```
9. パス内の '**'
```sql
select json_extract('{"k": 123, "b": {"k": ["ab", "cd"]}}', '$**.k');
```
```text
+---------------------------------------------------------------+
| json_extract('{"k": 123, "b": {"k": ["ab", "cd"]}}', '$**.k') |
+---------------------------------------------------------------+
| [123,["ab","cd"]] |
+---------------------------------------------------------------+
```
10. 値がNULLの場合
```sql
select JSON_EXTRACT('{"id": 123, "name": null}', '$.name') v, JSON_EXTRACT('{"id": 123, "name": null}', '$.name') is null v2;
```
```
+------+------+
| v | v2 |
+------+------+
| null | 0 |
+------+------+
```