JSON - Как добавить массив в массив в SQL - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть поле json в таблице, которая содержит такой массив: -

[
  {
    "ID": 11111,
    "Name": "apple",
  },
  {
    "ID": 22222,
    "Name": "orange",
  },
  {
    "ID": 333333,
    "Name": "banana",
  } 
] 

Я хотел бы добавить / объединить следующий массив json к этому: -

[
  {
    "ID": 44444,
    "Name": "grape",
  },
  {
    "ID": 55555,
    "Name": "kiwi",
  },
  {
    "ID": 66666,
    "Name": "fig",
  } 
] 

Итак, в итоге я получу следующее в поле таблицы: -

[
  {
    "ID": 11111,
    "Name": "apple",
  },
  {
    "ID": 22222,
    "Name": "orange",
  },
  {
    "ID": 333333,
    "Name": "banana",
  },
  {
    "ID": 44444,
    "Name": "grape",
  },
  {
    "ID": 55555,
    "Name": "kiwi",
  },
  {
    "ID": 66666,
    "Name": "fig",
  } 
] 

т.е. я добавил три новых элемента к трем существующим элементам, так что теперь у меня есть один массив с шестью элементамив моем поле таблицы.

Я пытался заставить эту работу работать с JSON_MODIFY и успешно добавил один элемент в массив с чем-то вроде этого: -

select JSON_MODIFY(json_field,'append $', JSON_QUERY('{ "ID": 44444, "Name": "grape" }'))

Но яне могу заставить его добавить более одного элемента в одну операцию и сделать так, чтобы он выглядел так, как хотелось бы, я пробовал варианты этого: -

select JSON_MODIFY(json_field,'append $', JSON_QUERY('[{ "ID": 44444, "Name": "grape" }, { "ID": 55555, "Name": "kiwi" }, { "ID": 66666, "Name": "fig" }]'))

В этом конкретном случае, он добавил его в квадратных скобкахТаким образом, три новых элемента оказались подмассивом!

Возможно ли добавить несколько элементов одного массива в другой, как это?(Я действительно толстый и скучаю по чему-то очевидному?!?)

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Из документации :

Пример - множественные обновления: с помощью JSON_MODIFY вы можете обновить только одно свойство.Если вам нужно сделать несколько обновлений, вы можете использовать несколько вызовов JSON_MODIFY.

Это будет означать зацикливание, чего я бы старался избегать ...

Я бы предложил либопростое строковое действие или декомпозиция / перекомпоновка:

DECLARE @json1 NVARCHAR(MAX)=
N'[
  {
    "ID": 11111,
    "Name": "apple"
  },
  {
    "ID": 22222,
    "Name": "orange"
  },
  {
    "ID": 333333,
    "Name": "banana"
  } 
]'; 
DECLARE @json2 NVARCHAR(MAX)=
N'[
  {
    "ID": 44444,
    "Name": "grape"
  },
  {
    "ID": 55555,
    "Name": "kiwi"
  },
  {
    "ID": 66666,
    "Name": "fig"
  } 
]';

- это заново создаст JSON из производных таблиц

SELECT t.ID,t.[Name]
FROM
(
    SELECT * FROM OPENJSON(@json1) WITH(ID int,[Name] NVARCHAR(MAX)) 
    UNION ALL
    SELECT * FROM OPENJSON(@json2) WITH(ID int,[Name] NVARCHAR(MAX))
) t
FOR JSON PATH;

- это создаст голый массив и STUFF() его в правильном положении

DECLARE @NakedArray NVARCHAR(MAX)=N',' +
(
    SELECT A.* 
    FROM OPENJSON(@json2)
    WITH(ID int, Name NVARCHAR(MAX)) A
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
);

SELECT STUFF(@json1,LEN(@json1)-1,0,@NakedArray);

голый массив , который можно получить, просто заменив [ запятой и вырезавпрочь ] тоже ...

ОБНОВЛЕНИЕ: минимальный подход

Попробуйте этот минимальный подход:

SELECT REPLACE(@json1,']',REPLACE(@json2,'[',','));
0 голосов
/ 21 декабря 2018

Попробуйте это:

DECLARE @j1 AS NVARCHAR(MAX) = '[
  {
    "ID": 11111,
    "Name": "apple"
  },
  {
    "ID": 22222,
    "Name": "orange"
  },
  {
    "ID": 333333,
    "Name": "banana"
  } 
] ';


DECLARE @j2 AS NVARCHAR(MAX) = '
[
  {
    "ID": 44444,
    "Name": "grape"
  },
  {
    "ID": 55555,
    "Name": "kiwi"
  },
  {
    "ID": 66666,
    "Name": "fig"
  } 
] ';


SELECT * FROM
(
SELECT [ID], [Name] FROM  OPENJSON(@j1) WITH (ID INT, [Name] NVARCHAR(200))
UNION
SELECT  [ID], [Name]  FROM  OPENJSON(@j2) WITH (ID INT, [Name] NVARCHAR(200))
) x
FOR JSON AUTO 
...