SQL ServerでJSONを使用する場合は、JSON_VALUE()を使用できます。 JSON文字列からスカラー値を返す関数。
この関数を使用するには、2つの引数を指定します。 JSON式、および抽出するプロパティ。
構文
構文は次のようになります:
JSON_VALUE ( expression , path )
expressionの場所 はJSON文字列式であり、path その式から抽出するプロパティです。
path引数には、オプションのパスモードを含めることができます。 成分。このオプションのパスモードは、laxのいずれかの値にすることができます またはstrict 。この値がある場合は、ドル記号の前に表示されます。
例1-基本的な使用法
JSON_VALUE()の基本的な使用法を示す例を次に示します。 機能。
SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';
結果:
+----------+ | Result | |----------| | Bruce | +----------+
この例では:
-
{"Name": "Bruce"}引数はJSON式です(小さいものですが、それでも有効なJSON式です)。 JSON式は、キーと値のペアで構成されます。この場合、Nameキーは、Bruceその価値です。 $.Name引数はパスです。このパスは、Nameの値を参照します JSON式のキー。したがって、ペアの名前を参照することで値を抽出できます。
例2–アレイ
配列から値を抽出するには、角括弧内のインデックスを参照し、その後に関連するキーを続けます。次に例を示します:
/*
CREATE THE ARRAY (and put into a variable called @data)
*/
DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Cities": [
{
"Name": "Kabul",
"CountryCode": "AFG",
"District": "Kabol",
"Population": 1780000
},
{
"Name": "Qandahar",
"CountryCode": "AFG",
"District": "Qandahar",
"Population": 237500
}
]
}'
/*
QUERY THE ARRAY
*/
SELECT
JSON_VALUE(@data,'$.Cities[0].Name') AS 'Name',
JSON_VALUE(@data,'$.Cities[0].CountryCode') AS 'Country Code',
JSON_VALUE(@data,'$.Cities[0].District') AS 'District',
JSON_VALUE(@data,'$.Cities[0].Population') AS 'Population'
UNION ALL
SELECT
JSON_VALUE(@data,'$.Cities[1].Name') AS 'Name',
JSON_VALUE(@data,'$.Cities[1].CountryCode') AS 'Country Code',
JSON_VALUE(@data,'$.Cities[1].District') AS 'District',
JSON_VALUE(@data,'$.Cities[1].Population') AS 'Population';
結果:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
したがって、この例では、JSON配列を作成し、それを@dataという変数に入れます。 。次に、@dataを使用してクエリを実行します JSON_VALUE()の最初の引数として 関数(これは@dataが原因です JSON式が含まれています)。
配列はゼロベースの番号付けを使用するため、最初の項目を抽出するには、Cities[0]を使用する必要があります。 、2番目のCities[1] 、など。
例3–データベースの例
前の例のデータをデータベースに入れる場合、クエリを次のように書き直すことができます。
SELECT JSON_VALUE(Document,'$.Cities[0].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[0].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[0].District') AS 'District', JSON_VALUE(Document,'$.Cities[0].Population') AS 'Population' FROM Json_Documents UNION ALL SELECT JSON_VALUE(Document,'$.Cities[1].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[1].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[1].District') AS 'District', JSON_VALUE(Document,'$.Cities[1].Population') AS 'Population' FROM Json_Documents
結果:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
これは、JSONドキュメントがDocumentという列に保存されていることを前提としています。 、Json_Documentsというテーブルにあります 。
例4–パスモード
前述のように、パスモードを指定するオプションもあります。これはlaxのいずれかです。 またはstrict 。
パスモードの値は、パス式にエラーが含まれている場合に何が起こるかを決定します。具体的には:
- 緩い モードでは、パス式にエラーが含まれている場合、関数は空の値を返します。たとえば、値$。nameをリクエストした場合 、およびJSONテキストに名前が含まれていない キーを押すと、関数はnullを返しますが、エラーは発生しません。
-
厳格 モードの場合、パス式にエラーが含まれていると、関数はエラーを発生させます。
デフォルト値はlaxです 。
これら2つのモードの違いを示す例を次に示します。
緩いモードでのエラー
緩いモードでパス式にエラーが含まれていると、次のようになります。
SELECT JSON_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';
結果:
+----------+ | Result | |----------| | NULL | +----------+
この例では、Hobbiesを参照しようとしています。 、ただし、そのキーはJSONドキュメントに存在しません。この場合、null値を取得します(緩いモードを使用しているため)。
厳密モードでのエラー
同じコードを厳密モードで実行すると、次のようになります。
SELECT JSON_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';
結果:
Msg 13608, Level 16, State 1, Line 1 Property cannot be found on the specified JSON path.
予想どおり、厳密モードではエラーメッセージが表示されます。
例5–オブジェクトと配列を返す
JSON_VALUE() 関数はオブジェクトと配列を返しません。オブジェクトまたは配列を返す場合は、JSON_QUERY()を使用します 代わりに機能します。クエリ内で両方の関数を使用する例を次に示します。
DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Mae Sai",
"Province": "Chiang Rai",
"Country": "Thailand"
},
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
}'
SELECT
JSON_VALUE(@data,'$.Suspect.Name') AS 'Name',
JSON_VALUE(@data,'$.Suspect.Address.Country') AS 'Country',
JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies',
JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
結果:
+---------------+-----------+----------------------------------------+--------------+ | Name | Country | Hobbies | Last Hobby | |---------------+-----------+----------------------------------------+--------------| | Homer Simpson | Thailand | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+-----------+----------------------------------------+--------------+
この場合、JSON_VALUE()を使用します さまざまなスカラー値を返すには、JSON_QUERY() 配列を返します。
したがって、オブジェクトまたは配列(JSONドキュメント全体を含む)を返す必要がある場合は、JSON_QUERY()を参照してください。 SQLServerの例。