将列内包含 JSON 数组的行扩展为多行

Posted

技术标签:

【中文标题】将列内包含 JSON 数组的行扩展为多行【英文标题】:Expand row with an JSON Array inside a Column to multiple rows 【发布时间】:2019-05-03 08:04:21 【问题描述】:

我遇到了 SQL-Data-Migration (SQL Server) 问题,希望您能指导我正确的方向。

假设,我们有一个表 DataTable(简化名称),其中包含以下列:

DataID | SomeForeignKey | SpecificDataValues | OtherSpecificDataValues
int    | int            | String             | String
-------+----------------+--------------------+------------------------
0      | 1              | ['1','2']          | ['1', '2']

其中SpecificDataValuesOtherSpecificDataValues 是JSON 数组(如['1', '2']

现在我想将此表(最好使用 SQL 迁移脚本)迁移到新表:

DataValuesTable
DataID | SomeForeignKey | SpecificDataValues | OtherSpecificDataValues
-------+----------------+--------------------+------------------------
0      | 1              | 1                  | 1
1      | 1              | 2                  | 2

所以,我基本上想在新表中为每个值生成一个新行,存储在“SpecificDataValues”和“OtherSpecificDataValues”中

我已经检查过,有一些 SQL 函数可用于 JSON(OPENJSON、JSON_QUERY),但我无法使用此工具产生所需的结果。

希望你能给我指明正确的方向。

【问题讨论】:

【参考方案1】:

一种解决方案是使用OPENJSON 两次。它将生成 Array(2) x Array(2) = 4 行,您感兴趣的是索引位置匹配的行:

SELECT DataID, SomeForeignKey, j1.value, j2.value
FROM t
CROSS APPLY OPENJSON(SpecificDataValues) AS j1
CROSS APPLY OPENJSON(OtherSpecificDataValues) AS j2
WHERE j1.[key] = j2.[key]

另一种解决方案是同时使用OPENJSONJSON_VALUE

SELECT DataID, SomeForeignKey, j1.value, JSON_VALUE(OtherSpecificDataValues, CONCAT('$[', CAST(j1.[key] AS INT), ']'))
FROM t
CROSS APPLY OPENJSON(SpecificDataValues) AS j1

请注意,您的“JSON”无效。字符串必须包含在 " 内。

Demo on db<>fiddle

【讨论】:

太好了,完美,非常感谢!祝你有美好的一天!

以上是关于将列内包含 JSON 数组的行扩展为多行的主要内容,如果未能解决你的问题,请参考以下文章

DataFrame:将列内的数组转换为 RDD[Array[String]]

Pandas - 在数据框中的列内扩展嵌套的 json 数组

将新的键/值对添加到 PostgreSQL JSON 列内的嵌套数组中

将 json 对象中的元素数组保存到不同的行中

如何在 Eloquent 中查询 JSON 列内的数组

将列拆分为多行