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.
予想どおり、厳密モードではエラーを説明するエラーメッセージが表示されます。