sql - 将列内包含 JSON 数组的行扩展到多行

标签 sql json sql-server t-sql

我遇到了 SQL 数据迁移 (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),但我无法使用此工具生成所需的结果。

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

最佳答案

一种解决方案是使用 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

关于sql - 将列内包含 JSON 数组的行扩展到多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55965621/

相关文章:

SQL 查询未运行,其中列名是保留字

javascript - java中读取目录结构并将其转换为JSON对象

python - 如何使用 Python 从网站获取并验证 JSON 数据?

c# - 从 DateTime.Now 计算 db.DaysPastDue - Controller 中的 db.Loan.DueDate

PHP/MySQL 嵌套获取?

sql - 递归公用表表达式

PHP:多个 SQL 查询与一个怪物

php - 编码、序列化和编码

sql - SSIS 中的条件拆分

sql-server - 将数据库附加到 SQL Server 2008 R2 实例后 CDC 失败