TSQL JSON_QUERY вы можете использовать фильтр в пути JSON

У меня есть таблица со столбцом, который содержит действительный 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"
                    ]
                }
            }
        ]
    }
}

Мне нужно вернуть значения из коллекции MultiSelected в зависимости от значения ListID.

Я использую следующий путь JSON для возврата значения

$.Requirements."$values"[?(@.ListId=='956cf9c5-24ab-47d9-8082-940118f2f1a3')].MultiSelected."$values"

Это отлично работало в тестере JSON Expression.

Но когда я пытаюсь использовать его для запроса таблицы, я получаю следующую ошибку:

Путь 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).

Заранее благодарны за Вашу помощь.

Энди


person SamualDexter    schedule 14.01.2020    source источник
comment
Вы когда-нибудь находили решение этой проблемы? Спасибо, Джол.   -  person jolySoft    schedule 21.07.2021


Ответы (1)


Вместо этого я бы дважды использовал openjson

drop table if exists #payload
create table #payload(ID int,Payload nvarchar(max))
insert into #payload VALUES
(3,N'
{
    "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"
                    ]
                }
            }
        ]
    }
}'
)

SELECT  ID                                          AS PayloadID,
Items.[value]
FROM    #Payload a
CROSS APPLY OPENJSON(  Payload, '$.Requirements."$values"' ) with ( ListId varchar(50),MultiSelected nvarchar(max) as json) b
CROSS APPLY OPENJSON(  MultiSelected,'$."$values"' )  Items
where 
   a.id=3
   AND b.listid='956cf9c5-24ab-47d9-8082-940118f2f1a3'

Отвечать:

+-----------+--------+
| PayloadID | value  |
+-----------+--------+
|         3 | Value1 |
|         3 | Value2 |
|         3 | Value3 |
+-----------+--------+
person Søren Kongstad    schedule 14.01.2020
comment
Ценю ответ, но нужно знать синтаксис фильтра? (...) поддерживается в JSON_QUERY? - person jamir; 18.03.2020