Выберите одну строку для каждого элемента JSON в поле SQL / преобразуйте поле JSON в строки - PullRequest
2 голосов
/ 07 октября 2019

У меня есть таблица с большим количеством строк, например:

ID     |     Attributes
1      |     {"Rank":1, "LoadLocation": London, "Driver":Tom}
2      |     {"Rank":2, "LoadLocation": Southampton, "Driver":Dick}
3      |     {"Rank":3, "DischargeLocation": Stratford}

Шаблон для JSON отсутствует - это площадка для любого количества атрибутов строк идентификатора.

Для использования в объединении я хотел бы получить их в виде таблицы:

ID     |     Attribute Name     |  Attribute Value 
1      |     'Rank'             |   1
1      |     'LoadLocation'     |   'London'
1      |     'Driver'           |   'Tom'
2      |     'Rank'             |    2
2      |     'LoadLocation'     |   'Southampton'
2      |     'Driver'           |   'Dick'
3      |     'Rank'             |    3 
3      |     'DischargeLocation'|   'Stratford'

Я вижу, что мне, вероятно, нужно использовать OpenJSON, но также и для этого яскорее всего нужно знать явную структуру. Я не знаю структуру, даже до точки каждого ряда, имеющего различное количество атрибутов.

Любая помощь с благодарностью получена!

1 Ответ

6 голосов
/ 07 октября 2019

Если у вас есть sql-server-2016 и выше, вы можете использовать OPENJSON с CROSS APPLY

DECLARE @TestData TABLE (ID INT, Attributes VARCHAR(500))
INSERT INTO @TestData VALUES
(1 ,'{"Rank":1, "LoadLocation": "London", "Driver":"Tom"}'),
(2 ,'{"Rank":2, "LoadLocation": "Southampton", "Driver":"Dick"}'),
(3 ,'{"Rank":3, "DischargeLocation": "Stratford"}')


SELECT T.ID, X.[key] AS [Attribute Name], X.value AS [Attribute Value] 
FROM @TestData T
    CROSS APPLY (SELECT * FROM OPENJSON(T.Attributes)) AS X

Результат:

ID          Attribute Name       Attribute Value    
----------- -------------------- -------------------
1           Rank                 1
1           LoadLocation         London
1           Driver               Tom
2           Rank                 2
2           LoadLocation         Southampton
2           Driver               Dick
3           Rank                 3
3           DischargeLocation    Stratford
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...