将列内包含 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']
其中SpecificDataValues
和OtherSpecificDataValues
是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]
另一种解决方案是同时使用OPENJSON
和JSON_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 数组