0

有効な 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) に設定されています。

事前にご協力いただきありがとうございます。

アンディ

4

1 に答える 1