有効な JSON を保持する列を含むテーブルがあります。JSON 構造の例を次に示します。
{
"Requirements": {
"$values": [
{
"$type": "List",
"ListId": "956cf9c5-24ab-47d9-8082-940118f2f1a3",
"DefaultValue": "",
"MultiSelect": true,
"Selected": null,
"MultiSelected": {
"$type": "ListItem",
"$values": [
"Value1",
"Value2",
"Value3"
]
}
},
{
"$type": "List",
"ListId": "D11149DD-A682-4BC7-A87D-567954779234",
"DefaultValue": "",
"MultiSelect": true,
"Selected": null,
"MultiSelected": {
"$type": "ListItem",
"$values": [
"Value4",
"Value5",
"Value6",
"Value7"
]
}
}
]
}
}
ListID の値に応じて、MultiSelected コレクションから値を返す必要があります。
次の JSON パスを使用して値を返します
$.Requirements."$values"[?(@.ListId=='956cf9c5-24ab-47d9-8082-940118f2f1a3')].MultiSelected."$values"
これは、JSON 式テスターで問題なく機能しました。
しかし、それを使用してテーブルをクエリしようとすると、次のエラーが発生します。
JSON パスの形式が正しくありません。予期しない文字「?」25位にあります。
私が使用しているクエリは次のとおりです。
SELECT ID AS PayloadID,
Items.Item AS ItemsValues
FROM dbo.Payload
CROSS APPLY ( SELECT *
FROM OPENJSON( JSON_QUERY( Payload, '$.Requirements."$values"[?(@.ListId==''956cf9c5-24ab-47d9-8082-940118f2f1a3'')].MultiSelected."$values"' ) )
WITH ( Item nvarchar(200) '$' ) ) AS Items
WHERE ID = 3
交換してみました
?(@.ListId==''956cf9c5-24ab-47d9-8082-940118f2f1a3'')
0 を指定すると、SQL Server で正常に動作します。
私の質問は、JSON_QUERY でフィルター構文 ?(...) がサポートされているか、それとも何か他にすべきことはありますか?
データベースは Azure で実行されており、データベースの互換性レベルは SQL Server 2017 (140) に設定されています。
事前にご協力いただきありがとうございます。
アンディ