Объединение значений массива с помощью Json_Query - PullRequest
1 голос
/ 28 мая 2020

У меня есть таблица в базе данных SQL Server, в которой JSON хранится в одном из столбцов. Структура выглядит следующим образом:

Table Person

| Name   |      ExtraInfo                             |
|--------|:------------------------------------------:|
| Bob    |  {"Age":"23","Colors":["Red","Blue"]}      |
| James  |  {"Age":"26","Colors":["Green","Yellow"]}  |

Если я выполню этот запрос:

select
Json_value(ExtraInfo,'$.Age') as Age,
json_query(ExtraInfo, '$.Colors') as Colors
from Persons

Я получу что-то вроде этого :

| Age |Colors              |
|-----|:-------------------|
| 23  |  ["Red","Blue"]    |
| 26  |  ["Green","Yellow"]|

Однако мне нужно преобразовать свойство Colors массива JSON в столбец nvarchar со всеми значениями массива, объединенными пробелом, например:

| Age | Colors       |
|-----|:-------------|
| 23  | Red Blue     |
| 26  | Green Yellow |

Есть ли способ, которым я могу составить несколько вызовов json_query или какой-либо другой аналогичный подход для выполнения sh этого в одном запросе SQL?

1 Ответ

3 голосов
/ 28 мая 2020

Один из вариантов - использовать CROSS APPLY и string_agg()

Пример

Declare @YourTable Table ([Name] varchar(50),[ExtraInfo] varchar(50))  Insert Into @YourTable Values 
 ('Bob','{"Age":"23","Colors":["Red","Blue"]}')
,('James','{"Age":"26","Colors":["Green","Yellow"]}')


Select Json_value(ExtraInfo,'$.Age') as Age
      ,B.*
 From @YourTable A
 Cross Apply (
                Select Colors = STRING_AGG( value ,' ')
                 From  OpenJSON(json_query(ExtraInfo, '$.Colors'),'$')
             ) B

Возвращает

Age Colors
23  Red Blue
26  Green Yellow
...