適用対象:SQL Server 2016 (13.x) 以降
Azure SQL データベース
Azure SQL Managed Instance
Azure Synapse Analytics (サーバーレスの SQL プールのみ)
JSON オブジェクトのプロパティを参照するには、JSON パス式を使用します。
次の関数を呼び出すときに、パス式を指定する必要があります。
- OPENJSON を呼び出して、JSON データのリレーショナル ビューを作成します。
- JSON_VALUE を呼び出して、JSON テキストから値を抽出します。
- JSON_QUERY を呼び出して、JSON オブジェクトまたは配列を抽出します。
- JSON_MODIFY を呼び出して、JSON 文字列内のプロパティの値を更新します。
パス式の各部
パス式には 2 つのコンポーネントがあります。
パス 自体。
パス モード
パス式の先頭で、必要に応じてキーワード 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');
経路
省略可能なパス モード宣言の後に、パス自体を指定します。
ドル記号 (
$
) はコンテキスト アイテムを表します。プロパティのパスは、パス ステップのセットです。 パス ステップには、次の要素と演算子を含めることができます。
キー名。 たとえば、
$.name
や$."first name"
す。 キー名がドル記号で始まるか、キー名にスペースやドット演算子 (.
) などの特殊文字が含まれている場合は、引用符で囲みます。配列の要素。 たとえば、
$.product[3]
のようにします。 配列は 0 から始まります。ドット演算子 (
.
) は、オブジェクトのメンバーを示します。 たとえば、$.people[1].surname
では、surname
はpeople
の子です。入力が JSON 型の値である場合は、配列ワイルドカードと範囲検索もサポートされます。
配列ワイルドカードと範囲のサポート
注
配列ワイルドカードと範囲のサポートは現在プレビュー段階であり、SQL Server 2025 (17.x) プレビューでのみ使用できます。
SQL Server 2025 (17.x) プレビューでは、配列ワイルドカードをサポートするように ANSI SQL/JSON パス式が拡張されています。 配列ワイルドカードを使用すると、すべての要素、要素の範囲、要素の一覧、または JSON 配列の最後の値を示す特別なトークン "last" を指定できます。 SQL/JSON 配列では、0 から始まるインデックスが使用されます。 ワイルドカードを含む SQL/JSON パスは、 JSON_QUERY、 JSON_PATH_EXISTS、 およびJSON_CONTAINSで使用できます。
JSON_VALUE
関数は SQL/JSON パス式をサポートしていますが、JSON_VALUE
関数の戻り値は SQL スカラーであるため、この関数は常に JSON オブジェクトまたは配列を指す任意の SQL/JSON パスのNULL
を返します。 配列ワイルドカードは、入力が json 型の場合にのみサポートされます。
次の構文は、ワイルドカード、範囲、および特殊なトークン last
の使用方法を示しています。
path[elements ]
elements ::= {
*
| number
| number to number
| last
| {number...[, number] }
}
数値の代わりに、特殊なトークン last
を使用できます。 範囲を指定する場合は、範囲を増やす順序で指定する必要があります。
有効な SQL/JSON パス式の例:
経路 | 説明 |
---|---|
$[*] |
すべての要素 |
$[0] |
最初の要素 |
$[0 to 2] |
最初の 3 つの要素 |
$[last] |
最後の要素 |
$[last, 0] |
[無効] |
$[last, 2, 0, last] |
[無効] |
$.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 返します。 |
例
このセクションの例では、次の JSON テキストを参照します。
{
"people": [{
"name": "John",
"surname": "Doe"
}, {
"name": "Jane",
"surname": null,
"active": true
}]
}
次の表に、パス式の例をいくつか示します。
パス式 | 値 |
---|---|
$.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');
SQL Server と Azure SQL Database の JSON の詳細情報
SQL Server と Azure SQL Database の組み込み JSON サポートの視覚的な概要については、次のビデオを参照してください。