JSONドキュメントから値を抽出しようとしているが、同じレベルの1つ以上の値に重複するキーがある場合、 JSON_QUERY()
> またはJSON_VALUE()
。
これらの関数は両方とも、パスに一致する最初の値のみを返します。
幸い、別のオプションがあります。
OPENJSON()
関数は、同じレベルの重複キーからすべての値を返します。
例
OPENJSON()
を示す例を次に示します。 同じレベルで重複するプロパティを返します。
DECLARE @json NVARCHAR(4000)=N'{"dog":{"details":{"name": "Fetch"、 "name": "Good Dog"、 "sex": "male "}}}'; SELECT * FROM OPENJSON(@json、' $ .dog.details');
結果:
+ ------- + ---------- + -------- + |キー|値|タイプ||-------+ ---------- + -------- ||名前|フェッチ| 1 ||名前|良い犬| 1 ||セックス|男性| 1 | + ------- + ---------- + -------- +
この例では、$。dog.details
のすべての子を返します。 キー。
この場合、同じレベルに同じ名前の2つのキーがあります( name
キー)。
2つのname
からの値だけを返したい場合 キーの場合、次のようなことができます。
DECLARE @json NVARCHAR(4000)=N'{"dog":{"details":{"name": "Fetch"、 "name": "Good Dog"、 "sex": "male "}}}'; SELECT value FROM OPENJSON(@json、' $ .dog.details')WHERE [key] ='name';
結果:
+ ---------- + |値||----------||フェッチ||良い犬|+---------- +
JSON_VALUE()
& JSON_QUERY()
前述のように、両方の JSON_VALUE()
およびJSON_QUERY()
パスに一致する最初の値のみを返します。
したがって、上記のJSONドキュメントに対してこれらを使用しようとすると、次の結果が得られます。
JSON_VALUE()
JSON_VALUE()
JSON文字列からスカラー値を返すため、次の結果が返されます。
DECLARE @json NVARCHAR(4000)=N'{"dog":{"details":{"name": "Fetch"、 "name": "Good Dog"、 "sex": "male "}}}'; SELECT JSON_VALUE(@json、' $ .dog.details.name')AS [JSON_VALUE];
結果:
+ -------------- + | JSON_VALUE || -------------- ||フェッチ|+-------------- +
JSON_QUERY()
JSON_QUERY()
JSON文字列からオブジェクトまたは配列を抽出するため、次の結果が返されます。
DECLARE @json NVARCHAR(4000)=N'{"dog":{"details":{"name": "Fetch"、 "name": "Good Dog"、 "sex": "male "}}}'; SELECT JSON_QUERY(@json、' $ .dog.details')AS [JSON_QUERY];
結果:
+ -------------- + | JSON_QUERY || -------------- || {"name": "Fetch"、 "name": "Good Dog"、 "sex": "male" + ---- |少なくとも
JSON_QUERY()
では 重複するキーを確認できますが、OPENJSON()
のように個々の値を取得することはできません。 。