Разбор JSON в SQL - PullRequest
       28

Разбор JSON в SQL

1 голос
/ 23 сентября 2019

Я пытаюсь проанализировать массивы JSON на сервере SQL в табличной форме. Вот строка данных

CREATE TABLE #JSONData
(
[gca] NVARCHAR(MAX)
,[User] INT
);
INSERT INTO #JSONData
VALUES ('
{"items":[{"i":"image1",
                 "url":"url-1",
                 "name":"Product 1",
                 "quantity":"1",
                 "sku":"112233",
                 "subtotal":"$24.99"},
                 {"i":image3",
                 "url":"url-3",
                 "name":"Product 3",
                 "quantity":"1",
                 "sku":"112255",
                 "subtotal":"$7.99"}]}
        ', 1)

Я использую Microsoft SQL Server 2016

Я пытаюсь использовать IS JSONфункция, чтобы проверить, является ли она допустимой строкой JSON - положительная, но я получаю нулевой вывод при использовании функции JSON _VALUE

SELECT [User],
       [gca], 
       ISJSON([gca]) AS [ISJSON], 
       JSON_VALUE([gca], '$.i') AS [i],
       JSON_VALUE([gca], '$.name') AS [Product],
       JSON_VALUE([gca], '$.quantity') AS [Quantity],
       JSON_VALUE ([gca], '$.subtotal') AS [subtotal],
       [User]

FROM #JSONData

enter image description here

1 Ответ

0 голосов
/ 23 сентября 2019

Следующий подход может помочь вам получить ожидаемые результаты.Функция JSON_VALUE извлекает скалярное значение из строки JSON.$.items часть ввода JSON представляет собой массив JSON, поэтому вам нужно использовать OPENSJSON() с явной схемой для анализа этого массива JSON как таблицы:

Таблица:

CREATE TABLE #JSONData ( 
   [gca] NVARCHAR(MAX),
   [User] INT
); 
INSERT INTO #JSONData 
VALUES 
   (N'
{"items":[{"i":"image1",
                 "url":"url-1",
                 "name":"Product 1",
                 "quantity":"1",
                 "sku":"112233",
                 "subtotal":"$24.99"},
                 {"i":"image3",
                 "url":"url-3",
                 "name":"Product 3",
                 "quantity":"1",
                 "sku":"112255",
                 "subtotal":"$7.99"}]}
        ', 1)

Оператор:

SELECT 
   j.*,
   d.[User] AS u
FROM #JSONData d
CROSS APPLY OPENJSON(d.[gca], '$.items') WITH (
   i varchar(100) '$.i',
   p varchar(50) '$.name',
   q int '$.quantity',
   s varchar(20) '$.subtotal'
) j

Вывод:

---------------------------------
i       p           q   s       u
---------------------------------
image1  Product 1   1   $24.99  1
image3  Product 3   1   $7.99   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...