メインコンテンツまでスキップ
バージョン: 26.x

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]を使用できます。
    • *はワイルドカードを表し、$.*はルートオブジェクトのすべてのメンバーを、$[*]は配列のすべての要素を表します。
    • **は'$'と組み合わせて使用され、'$**'はすべてのパス(多層サブパスを含む)を表します。
  • <path>にワイルドカード(*)が含まれる場合、マッチング結果は配列形式で返されます。

Examples

  1. General parameters
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] |
    +--------------------------------------------------------------------------------+

一致するものが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 |
+------+------+
```