SQL 将 JSON 列表解析为另一个 table 中的单独行
SQL Parse a JSON list into separate rows in another table
我将遥测数据连续发送到我的 Azure SQL 数据库,最终以以下格式登陆 table:
INSERT INTO landing (ID, rawData)
VALUES
('Device1', [{"value1":"str1","value2":-109.0,"value3":3,"uselessvalue":16.0},{"value1":"str2","value2":-111.0,"value3":3,"uselessvalue":21.0},{"value1":"str3","value2":-113.0,"value3":2,"uselessvalue":18.0}]);
列表中的 JSON 数量可以从 1 个到几十个不等。
我正在尝试将这些值分隔在另一个 table 中的确定行中,以便可以通过这种方式发送它们(可能在触发器内):
INSERT INTO parsedData (ID, value1, value2, value3)
VALUES
('Device1', 'str1', -109.0, 3),
('Device1', 'str2', -111.0, 3),
('Device1', 'str3', -113.0, 2);
我找到了几种方法(用逗号分隔、使用 WHILE 循环、使用 Azure 不支持的关键字,例如 UNNEST),但到目前为止我找不到方法。
在 SQL 服务器中,您可以使用 openjson()
:
取消嵌套 JSON 数组
insert into parseddata (id, value1, value2, value3)
select l.id, x.*
from landing l
cross apply openjson(l.rawdata) with (
value1 varchar(50) '$.value1',
value2 decimal(5, 2) '$.value2',
value3 int '$.value3'
) x
我不得不对 json 对象中的数据类型做出一些假设,您可能需要查看这些假设。
我将遥测数据连续发送到我的 Azure SQL 数据库,最终以以下格式登陆 table:
INSERT INTO landing (ID, rawData)
VALUES
('Device1', [{"value1":"str1","value2":-109.0,"value3":3,"uselessvalue":16.0},{"value1":"str2","value2":-111.0,"value3":3,"uselessvalue":21.0},{"value1":"str3","value2":-113.0,"value3":2,"uselessvalue":18.0}]);
列表中的 JSON 数量可以从 1 个到几十个不等。
我正在尝试将这些值分隔在另一个 table 中的确定行中,以便可以通过这种方式发送它们(可能在触发器内):
INSERT INTO parsedData (ID, value1, value2, value3)
VALUES
('Device1', 'str1', -109.0, 3),
('Device1', 'str2', -111.0, 3),
('Device1', 'str3', -113.0, 2);
我找到了几种方法(用逗号分隔、使用 WHILE 循环、使用 Azure 不支持的关键字,例如 UNNEST),但到目前为止我找不到方法。
在 SQL 服务器中,您可以使用 openjson()
:
insert into parseddata (id, value1, value2, value3)
select l.id, x.*
from landing l
cross apply openjson(l.rawdata) with (
value1 varchar(50) '$.value1',
value2 decimal(5, 2) '$.value2',
value3 int '$.value3'
) x
我不得不对 json 对象中的数据类型做出一些假设,您可能需要查看这些假设。