Запрос JSON в столбце в SQL и создание представления - PullRequest
0 голосов
/ 27 июня 2018

У меня есть таблица с JSON в одном из столбцов:

enter image description here

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

1 Ответ

0 голосов
/ 27 июня 2018

Если вы используете SQL 2016 и выше, вы можете использовать функцию OPONJSON, однако вам потребуется указать путь (внутри фрагмента кода json), который не может быть динамическим.

Вы можете использовать следующую пользовательскую функцию определения для извлечения всех элементов из JSON до последнего уровня, например массив / объект JSON внутри самого JSON.

это функция:

CREATE FUNCTION [dbo].[JsonTable] (@Json NVARCHAR(MAX))
RETURNS TABLE AS RETURN
WITH jsonRoot AS (
    SELECT 
        0 as parentLevel, 
        CONVERT(nvarchar(4000),NULL) as parentElementName, 
        0 AS [level], 
        [type] ,
        @Json  AS ElementName,
        [key]  as [Key],
        [value],
        ROW_NUMBER() OVER (ORDER BY (SELECT null)) AS ElementSequence
    FROM 
        OPENJSON(@Json, '$')
    UNION ALL
    SELECT 
        jsonRoot.[level] as parentLevel, 
        CONVERT(nvarchar(4000),jsonRoot.ElementName)  as parentElementName, 
        jsonRoot.[level]+1 as [level], 
        d.[type] as [type],
        CASE WHEN jsonRoot.[type] IN (4,5) THEN CONVERT(nvarchar(4000),jsonRoot.[Key]) ELSE jsonRoot.ElementName END  as ElementName,
        CASE WHEN jsonRoot.[type] IN (4) THEN jsonRoot.[Key] ELSE d.[key] END as [Key],
        d.[value],
        ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS ElementSequence
    FROM 
        jsonRoot
        CROSS APPLY OPENJSON(jsonRoot.[value], '$') d
    WHERE 
        jsonRoot.[type] IN (4,5) 

)

SELECT parentLevel , parentElementName ,[level] , [type] , ElementName , [Key] ,[value], ElementSequence
FROM jsonRoot

Вы можете использовать его следующим образом:

SELECT type , x.*
FROM YourTable t
    CROSS APPLY dbo.JsonTable (t.JSON) x

Это разбивает JSON на структуру таблицы, с которой вы можете работать в хранимой процедуре.

Дайте ему попытку.

...