メインコンテンツまでスキップ
に最終更新

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] を使用できます。以降も同様です。
    • * はワイルドカードを表します。$.* はルートオブジェクトのすべてのメンバー、$[*] は配列のすべての要素を表します。
    • ** は '′と組み合わせて使用します。′' と組み合わせて使用します。'**' は複数階層のサブパスを含むすべてのパスを表します。
  • <path> にワイルドカード(*)が含まれる場合、一致した結果は配列形式で返されます。
  • <path> は配列の各要素を自動的にはたどりません。<json_object> が JSON 配列で、<path> が $.k の場合、結果は NULL です。$.k はオブジェクトのメンバーのみをたどります。インデックスを指定して要素を対象にするには $[i].k を使用します。配列のすべての要素からフィールドを抽出するには、Doris 4.0 以降でサポートされるワイルドカード構文 $[*].k を使用します。

例​

  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"] |
+-------------+------------------+