【问题标题】:SQL Parse a JSON list into separate rows in another tableSQL 将 JSON 列表解析为另一个表中的单独行
【发布时间】:2020-11-19 23:10:01
【问题描述】:

我将遥测数据连续发送到我的 Azure SQL 数据库,该数据库最终以下列格式显示在其登陆表中:

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 个到几十个不等。

我正在尝试将这些值分隔在另一个表中的确定行中,以便可以以这种方式发送它们(可能在触发器内):

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 arrays json sql-server azure-sql-database


    【解决方案1】:

    在 SQL Server 中,您可以使用 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 对象中的数据类型做出一些假设,您可能需要查看这些假设。

    【讨论】:

    • 效果很好,谢谢!您知道如何将 value2 类型更改为 smallint(即使源值是小数)?如果我只是将数据类型更改为smallint,但我收到一条错误消息,表明转换失败,并且在尝试使用CAST时收到另一条错误消息
    猜你喜欢
    • 2012-03-13
    • 2013-10-19
    • 1970-01-01
    • 2021-08-21
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2018-11-16
    相关资源
    最近更新 更多