SQL ServerでJSONを使用する場合は、JSON_QUERY()
を使用できます。 JSON文字列からオブジェクトまたは配列を抽出する関数。
この関数を使用するには、JSON式を引数として指定します。抽出するオブジェクトまたは配列を指定するための2番目の(オプションの)引数を指定することもできます。
構文
構文は次のようになります:
JSON_QUERY ( expression [ , path ] )
expression
の場所 はJSON文字列式であり、path
その式から抽出するオブジェクトまたは配列です。 path
引数はオプションです(指定しない場合は、JSONドキュメント全体が返されます)。
パス引数(指定されている場合)には、オプションのパスモードを含めることができます。 成分。このオプションのパスモードは、lax
のいずれかの値にすることができます またはstrict
。この値は、指定されたパスが無効な場合に何が発生するかを決定します。パスモード(指定されている場合)はドル記号の前にあります。
例1-基本的な使用法
JSON_QUERY()
の基本的な使用法を示す例を次に示します。 機能。
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data, '$.Cities[0]') AS 'Result';
結果:
+----------+ | Result | |----------| | { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 } | +----------+
この例では、最初に@data
という変数を宣言して設定します。 。次に、この変数に配列を割り当てます。これを行ったら、その配列に対してクエリを実行します。
この場合、Cities[0]
を使用します 配列の最初の項目を参照します(JSON配列はゼロベースの番号付けを使用します)。
Cities[1]
を使用して2番目のアイテムにアクセスできました 。このように:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data, '$.Cities[1]') AS 'Result';
結果:
+----------+ | Result | |----------| | { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } | +----------+
例2–JSON式全体を返す
2番目の引数はオプションであるため、これを省略すると、JSONドキュメント全体が返されます。前の例と同じデータを使用してこれを行うと、次のようになります。
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data) AS 'Result';
結果:
+----------+ | Result | |----------| | { "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] } | +----------+
例3–データベースの例
前の例のデータをデータベースに入れる場合、クエリを次のように書き直すことができます。
SELECT JSON_QUERY(Document,'$.Cities[0]') AS 'City 1' FROM Json_Documents
結果:
+----------+ | City 1 | |----------| | { "ID": 1, "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 } | +----------+
これは、JSONドキュメントがDocument
という列に保存されていることを前提としています。 、Json_Documents
というテーブルにあります 。
例4–スカラー値
JSON_QUERY()
関数はスカラー値を返すようには設計されていません。スカラー値を返したい場合は、JSON_VALUE()
を使用してください 代わりに機能します。
ただし、クエリ内で両方の関数を組み合わせて、さまざまなレベルの粒度でデータを返すことを妨げるものは何もありません。
次に例を示します:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Name', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies', JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
結果:
+---------------+----------------------------------------+--------------+ | Name | Hobbies | Last Hobby | |---------------+----------------------------------------+--------------| | Homer Simpson | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+----------------------------------------+--------------+
この例では、JSON_VALUE()
を使用しました さまざまなスカラー値を抽出するために使用しましたが、JSON_QUERY()
も使用しました 配列全体を返します(JSON_VALUE()
できません)。
例5–パスモード
前述のように、パスモードを指定するオプションもあります。これはlax
のいずれかです。 またはstrict
。
パスモードの値は、パス式にエラーが含まれている場合に何が起こるかを決定します。具体的には:
- 緩い モードでは、パス式にエラーが含まれている場合、関数は空の値を返します。たとえば、値$。nameをリクエストした場合 、およびJSONテキストに名前が含まれていない キーを押すと、関数はnullを返しますが、エラーは発生しません。
-
厳格 モードの場合、パス式にエラーが含まれていると、関数はエラーを発生させます。
デフォルト値はlax
です 。
これら2つのモードの違いを示す例を次に示します。
緩いモードでのエラー
緩いモードでパス式にエラーが含まれていると、次のようになります。
SELECT JSON_QUERY('{"Name": "Bruce"}', 'lax $.Name') AS 'Result';
結果:
+----------+ | Result | |----------| | NULL | +----------+
この例では、スカラー値を返そうとしていますが、JSON_QUERY()
スカラー値は実行しません。前述のように、オブジェクトと配列のみを返します。この場合、null値を取得します(緩いモードを使用しているため)。
厳密モードでのエラー
同じコードを厳密モードで実行すると、次のようになります。
SELECT JSON_QUERY('{"Name": "Bruce"}', 'strict $.Name') AS 'Result';
結果:
Msg 13624, Level 16, State 2, Line 1 Object or array cannot be found in the specified JSON path.
予想どおり、厳密モードではエラーを説明するエラーメッセージが表示されます。