Гнездо Json Array слияния - PullRequest
0 голосов
/ 21 мая 2018

В моей таблице сохранены данные json в столбце:

declare @json nvarchar(max)
set @json = N'
{
    "Companies": [
        {
            "CompanyId": "A",
            "Employee": null
        },
        {
            "CompanyId": "B",
            "Employee": [
                {
                    "EmployeePictureId": null,
                    "Name": "Employee1"
                },
                {
                    "EmployeePictureId": "PictureId2",
                    "Name": "Employee2"
                }
            ]
        },
        {
            "CompanyId": "C",
            "Employee": [
                {
                    "EmployeePictureId": null,
                    "Name": "Employee3"
                },
                {
                    "EmployeePictureId": null,
                    "Name": "Employee4"
                }
            ]
        }
    ]
}
'

Возможно ли получить такой результат, как:

{
   "EmployeePictureIds": ["PictureId2"]
}

с использованием Json_Query, Json_Value, OPENJSON ...

Только получить EmployeePictureId и пропустить пустые (нулевые) данные

Кстати, количество элементов в массиве не точно.

1 Ответ

0 голосов
/ 23 мая 2018

В SQL Server 2017 вы можете использовать следующий запрос:

select json_query(QUOTENAME(STRING_AGG('"' + STRING_ESCAPE( A.EmployeePictureId , 'json') 
                  + '"', char(44)))) as [EmployeePictureIds]
FROM OPENJSON(@json, '$.Companies')
WITH 
( 
  CompanyId  NVARCHAR(MAX),
  Employee  NVARCHAR(MAX)  as json  
) as B
cross apply openjson (B.Employee)  
with  
(  
    EmployeePictureId VARCHAR(50),  
    [Name] VARCHAR(50)
) as A     
where A.EmployeePictureId is not null
for json path , WITHOUT_ARRAY_WRAPPER

Результаты для предоставленного вами JSON:

enter image description here

Результаты добавления еще одного ненулевого значения EmployeePictureId:

enter image description here

...