【问题标题】:How to extract array data from a JSON Column in SQL Server (OPENJSON, JSON_QUERY)如何从 SQL Server 中的 JSON 列中提取数组数据(OPENJSON、JSON_QUERY)
【发布时间】:2022-01-12 17:22:46
【问题描述】:

我们有一个 SQL Server 表,其中有一个包含 JSON 数据的 varchar(max) 列,但其中一个字段是一个数组。尽我所能,我无法让它每行提取这些。在过去,我设法做到了每个数组都由命名成员组成,因此使用另一个 CROSS APPLY WITH (...) 并命名成员。但是很难弄清楚如何使用更简单的值列表来做到这一点。

伪代码:

DROP TABLE IF EXISTS #MyTable
CREATE TABLE #MyTable (
  Id uniqueidentifier
  ,MyJsonText nvarchar(max))
INSERT INTO #MyTable(Id, MyJsonText) VALUES
('EDA4A604-59F4-4E4E-9C20-08D82314D8F6', '{"InitialCost":75.0,"OtherCost":50.0,"DatesOfVisit":["Wed, 26 Feb 2020 00:00:00 GMT","Fri, 20 Mar 2020 00:00:00 GMT"],"CatNumber":"PH123456"}')

SELECT ISJSON(MyJsonText) FROM #MyTable -- Check JSON ok

SELECT
  mt.Id
  ,mt_j.InitialCost
  ,mt_j.OtherCost
  ,mt_j.CatNumber
FROM #MyTable mt 
CROSS APPLY OPENJSON(mt.MyJsonText) WITH (
  InitialCost decimal(8,2)
  ,OtherCost decimal(8,2)
  ,CatNumber varchar(50)) as mt_j

以上内容适用于 JSON 中的“顶级”数据,但我该如何返回:

Id                                      InitialCost       OtherCost  DatesOfVisit              CatNumber
EDA4A604-59F4-4E4E-9C20-08D82314D8F6    75.00             50.00      Wed, 26 Feb 2020 00:00:00 GMT PH123456
EDA4A604-59F4-4E4E-9C20-08D82314D8F6    75.00             50.00      Fri, 20 Mar 2020 00:00:00 GMT PH123456

非常感谢任何指导!

【问题讨论】:

    标签: arrays json sql-server json-query open-json


    【解决方案1】:

    嵌套您的 JSON 调用:

    SELECT MT.Id,
           JT.InitialCost,
           JT.OtherCost,
           DV.value AS DateOfVisit
    FROM #MyTable MT
         CROSS APPLY OPENJSON(MT.MyJsonText)
                     WITH (InitialCost decimal(8,2),
                           OtherCost decimal(8,2),
                           DatesOfVisit nvarchar(MAX) AS JSON) JT
         CROSS APPLY OPENJSON(DatesOfVisit) DV;
    

    【讨论】:

    • 这是我缺少的一点谢谢,所以基本上,将数组视为 json。外部应用于此(内部)json,然后在外部查询中使用“.value”引用它。干杯!
    猜你喜欢
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多