に最終更新
JSON_EXTRACT
説明
JSON 型のデータから、json_path で指定したフィールドを抽出します。
構文
JSON_EXTRACT (<json_object>, <path>[, <path2>, ...])
パラメータ
| パラメータ | 説明 |
|---|---|
<json_object> | 必須。JSON 値、または JSON に変換できる有効な JSON テキスト。 |
<path> | 必須。STRING 型の JSON パス。配列をたどるには、ワイルドカードを明示的に使用します。 |
<path2>, ... | 省略可能な追加の STRING 型パス。一致した結果は JSON 配列にまとめられます。 |
戻り値
いずれかの引数が NULL の場合、またはどのパスも一致しない場合は、SQL の 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を使用します。配列のすべての要素からフィールドを抽出するには、Doris 4.0 以降でサポートされるワイルドカード構文$[*].kを使用します。
例
- 一般的なパラメータ
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"] |
+-------------+------------------+