次の方法で共有


SQL データベース エンジンの JSON パス式

Applies to: SQL Server 2016 (13.x) and later versions Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics (serverless SQL pool only)SQL database in Microsoft Fabric

JSON オブジェクトのプロパティを参照するには、JSON パス式を使用します。

次の関数を呼び出すときに、パス式を指定する必要があります。

  • When you call OPENJSON to create a relational view of JSON data.
  • When you call JSON_VALUE to extract a value from JSON text.
  • When you call JSON_QUERY to extract a JSON object or an array.
  • When you call JSON_MODIFY to update the value of a property in a JSON string.

パス式の各部

パス式には 2 つのコンポーネントがあります。

  1. The optional path mode, with a value of lax or strict.

  2. The path itself.

Path mode

パス式の先頭で、必要に応じてキーワード lax または strictを指定してパス モードを宣言します。 既定値は laxです。

  • lax モードでは、パス式にエラーが含まれている場合、関数は空の値を返します。 たとえば、 $.name値を要求し、JSON テキストに name キーが含まれていない場合、関数は null を返しますが、エラーは発生しません。

  • strict モードでは、パス式にエラーが含まれている場合、関数はエラーを発生させます。

次のクエリでは、パス式で lax モードが明示的に指定されています。

DECLARE @json AS NVARCHAR (MAX);

SET @json = N'{ ... }';

SELECT *
FROM OPENJSON (@json, N'lax $.info');

Path

省略可能なパス モード宣言の後に、パス自体を指定します。

  • ドル記号 ($) はコンテキスト アイテムを表します。

  • プロパティのパスは、パス ステップのセットです。 パス ステップには、次の要素と演算子を含めることができます。

    • Key names. たとえば、$.name$."first name"す。 キー名がドル記号で始まるか、キー名にスペースやドット演算子 (.) などの特殊文字が含まれている場合は、引用符で囲みます。

    • Array elements. たとえば、$.product[3] のようにします。 配列は 0 から始まります。

    • ドット演算子 (.) は、オブジェクトのメンバーを示します。 たとえば、$.people[1].surname では、surnamepeople の子です。

    • 入力が JSON 型の値である場合は、配列ワイルドカードと範囲検索もサポートされます。

配列ワイルドカードと範囲のサポート

Note

配列ワイルドカードと範囲のサポートは現在プレビュー段階であり、SQL Server 2025 (17.x) プレビューでのみ使用できます。

SQL Server 2025 (17.x) プレビューでは、配列ワイルドカードをサポートするように ANSI SQL/JSON パス式が拡張されています。 配列ワイルドカードを使用すると、すべての要素、要素の範囲、要素の一覧、または JSON 配列の最後の値を示す特別なトークン "last" を指定できます。 SQL/JSON 配列では、0 から始まるインデックスが使用されます。 SQL/JSON path with wildcards can be used in JSON_QUERY, JSON_PATH_EXISTS, and JSON_CONTAINS.

JSON_VALUE関数は SQL/JSON パス式をサポートしていますが、JSON_VALUE関数の戻り値は SQL スカラーであるため、この関数は常に JSON オブジェクトまたは配列を指す任意の SQL/JSON パスのNULLを返します。 Array wildcards are supported only if the input is a json type.

次の構文は、ワイルドカード、範囲、および特殊なトークン last の使用方法を示しています。

path[elements ]

elements ::= {
*
| number
| number to number
| last
| {number...[, number] }
}

数値の代わりに、特殊なトークン last を使用できます。 範囲を指定する場合は、範囲を増やす順序で指定する必要があります。

有効な SQL/JSON パス式の例:

Path Description
$[*] All elements
$[0] First element
$[0 to 2] 最初の 3 つの要素
$[last] Last element
$[last, 0] Invalid
$[last, 2, 0, last] Invalid
$.creditcards[0].type 配列内の最初の要素の type プロパティ値 creditcards 返します。
$.credit_cards[*].type 配列内のすべての要素の type プロパティ値 creditcards 返します。
$.credit_cards[0, 2].type 配列内の 1 番目と 3 番目の要素の type プロパティ値 creditcards 返します。
$.credit_cards[1 to 3].type 配列内の 2 番目から 4 番目の要素の type プロパティ値 creditcards 返します。
$.credit_cards[last].type 配列内の最後の要素の type プロパティ値 creditcards 返します。
$.credit_cards[last, 0].type 配列内の last 要素と first 要素の type プロパティ値 creditcards 返します。

Examples

このセクションの例では、次の JSON テキストを参照します。

{
    "people": [{
        "name": "John",
        "surname": "Doe"
    }, {
        "name": "Jane",
        "surname": null,
        "active": true
    }]
}

次の表に、パス式の例をいくつか示します。

Path expression Value
$.people[0].name John
$.people[1] { "name": "Jane", "surname": null, "active": true }
$.people[1].surname NULL
$ { "people": [ { "name": "John", "surname": "Doe" },{ "name": "Jane", "surname": null, "active": true } ] }
$.people[last].name ["Jane"]
$.people[0 to 1].name ["John","Jane"]
$.people[0, 1].name ["John","Jane"]

組み込み関数が重複するパスを処理する方法

JSON テキストに重複するプロパティ (たとえば、同じレベルで同じ名前の 2 つのキー) が含まれている場合、 JSON_VALUE 関数と JSON_QUERY 関数は、パスに一致する最初の値のみを返します。 重複するキーを含む JSON オブジェクトを解析し、すべての値を返すには、次の例に示すように、 OPENJSONを使用します。

DECLARE @json AS NVARCHAR (MAX);

SET @json = N'{"person":{"info":{"name":"John", "name":"Jack"}}}';

SELECT value
FROM OPENJSON (@json, '$.person.info');

JSON の詳細

組み込みの JSON サポートの視覚的な概要については、次のビデオを参照してください。