SQL JSON Запрос - получение данных в массиве JSON - PullRequest
0 голосов
/ 18 июня 2020

У меня следующая структура таблицы SQL «Товар»:

int Id
nvarchar(max) Details

Подробности содержат JSON строку со следующей структурой:

{
"Id": "10001",
"Description": "example description",
"Variants": [{
        "Title": "ABC / no",
        "Price": "10"
    }, {
        "Title": "ABC / Yes",
        "Price": "20",
    }, {
        "Title": "ABC / Yes",
        "Price": "30",
    }]
}

Мне нужно написать запрос SQL, который просматривает таблицу и возвращает все варианты с определенным заголовком.


Следующая работа

Получить все строки из таблица, поле Details которой содержит специфик c title

SELECT * FROM Products 
WHERE JSON_VALUE(Details, '$.Description') = 'example description'

Получить все строки из таблицы, в которой Details.Variants [0] .Title равно '{string}'

SELECT * FROM Products 
WHERE JSON_VALUE(Details, '$.Variants[0].Title') = 'ABC / no'

Получить все идентификаторы из таблицы, где Details.Variants [0] .Title равно '{string}'

SELECT JSON_VALUE(Details, '$.Id') 
FROM Products 
WHERE JSON_VALUE(Details, '$.Variants[0].Title') = 'ABC / no'

Мне нужно получить все варианты из всех строк в таблице Product, где заголовок варианта равен '{string}'

В этой документации есть аналогичный пример, но я не могу заставить его работать в моем конкретном случае.

Также есть этот столбик

1 Ответ

0 голосов
/ 18 июня 2020

Вам необходимо использовать OPENJSON() с явной схемой (определения столбцов) и дополнительные APPLY s для синтаксического анализа ввода JSON и получения ожидаемых результатов. Обратите внимание, что вам нужно использовать параметр AS JSON, чтобы указать, что часть $.Variants сохраненного JSON является массивом JSON.

Таблица:

CREATE TABLE Products (Id int, Details nvarchar(max))
INSERT INTO Products (Id, Details)
VALUES (1, N'{"Id":"10001","Description":"example description","Variants":[{"Title":"ABC / no","Price":"10"},{"Title":"ABC / Yes","Price":"20"},{"Title":"ABC / Yes","Price":"30"}]}"')

Заявление :

SELECT p.Id, j1.Id, j1.Description, j2.Title, j2.Price
FROM Products p
CROSS APPLY OPENJSON (p.Details, '$') WITH (
    Id int '$.Id',
    [Description] nvarchar(100) '$.Description',
    Variants nvarchar(max) '$.Variants' AS JSON
) j1
CROSS APPLY OPENJSON(j1.Variants) WITH (
    Title nvarchar(100) '$.Title',
    Price nvarchar(10) '$.Price'
) j2
WHERE 
   j2.Title = 'ABC / no'
   -- or j1.Description = 'example description'

Результат:

Id  Id      Description         Title       Price
1   10001   example description ABC / no    10
...