JSON - 如何在sql中将数组追加到数组中

dan*_*001 3 sql t-sql sql-server json sql-server-2016

我在表中有一个json字段,其中包含如下数组: -

[
  {
    "ID": 11111,
    "Name": "apple",
  },
  {
    "ID": 22222,
    "Name": "orange",
  },
  {
    "ID": 333333,
    "Name": "banana",
  } 
] 
Run Code Online (Sandbox Code Playgroud)

我想将以下json数组追加/连接到这个: -

[
  {
    "ID": 44444,
    "Name": "grape",
  },
  {
    "ID": 55555,
    "Name": "kiwi",
  },
  {
    "ID": 66666,
    "Name": "fig",
  } 
] 
Run Code Online (Sandbox Code Playgroud)

所以我最终在表格字段中得到了这个: -

[
  {
    "ID": 11111,
    "Name": "apple",
  },
  {
    "ID": 22222,
    "Name": "orange",
  },
  {
    "ID": 333333,
    "Name": "banana",
  },
  {
    "ID": 44444,
    "Name": "grape",
  },
  {
    "ID": 55555,
    "Name": "kiwi",
  },
  {
    "ID": 66666,
    "Name": "fig",
  } 
] 
Run Code Online (Sandbox Code Playgroud)

即我已经将三个新元素添加到三个现有元素中,以便我现在在我的表字段中有一个包含六个元素的数组.

我一直在尝试使用JSON_MODIFY来完成这项工作,并且成功地向数组中添加了一个元素,如下所示: -

select JSON_MODIFY(json_field,'append $', JSON_QUERY('{ "ID": 44444, "Name": "grape" }'))
Run Code Online (Sandbox Code Playgroud)

但是我不能让它在一个操作中附加多个元素并使它看起来像所希望的那样,我一直在尝试各种变体: -

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

在这种特殊情况下,它附加了方括号,因此三个新元素最终成为一个子数组!

有可能像这样将一个数组的多个元素追加到另一个数组吗?(我真的很厚,缺少明显的东西吗?!?)

Shn*_*ugo 6

文档:

示例 - 多个更新:使用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"
  } 
]';
Run Code Online (Sandbox Code Playgroud)

- 这将从派生表中重新创建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;
Run Code Online (Sandbox Code Playgroud)

- 这将创建一个裸阵列,并将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);
Run Code Online (Sandbox Code Playgroud)

裸数组,你可以通过更换简单地实现[用逗号和切去]太...

更新:最小的方法

尝试这种最小的方法:

SELECT REPLACE(@json1,']',REPLACE(@json2,'[',','));
Run Code Online (Sandbox Code Playgroud)

  • 最小的方法非常漂亮:) (2认同)