У меня есть таблица со столбцом, который содержит действительный 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).
Заранее благодарны за Вашу помощь.
Энди