【问题标题】:Extract values from JSON of Array in T-SQL从 T-SQL 中的 Array 的 JSON 中提取值
【发布时间】:2020-07-29 14:57:32
【问题描述】:

我有一个这样的 JSON 可以在 SQL 中处理

{"RowIndex":[1,2], "Data":["a","b"]}

我想提取数据以显示为这样的表格

RowIndex    Data
  1           a
  2           b

我知道我必须使用 OPENJSON、JSON_QUERY 或 JSON_VALUE,但我找不到一种方法来获得我想要的东西,这并不意味着要编写一个像这样的连接的查询

select  C1.value as RowIndex,
        C2.value as Data,
From (select [key], value from OPENJSON(JSON_QUERY(@jsonstring, '$.RowIndex'))) C1 
inner join (select [key], value from OPENJSON(JSON_QUERY(@jsonstring, '$.Data'))) C2 on C1.[key] = C2.[key] 

因为如果 JSON 中的数组增长,查询将无法维护且速度很慢

【问题讨论】:

    标签: arrays json tsql


    【解决方案1】:

    一种方法,使用“一对”OPENJSON 子句:

    DECLARE @JSON nvarchar(MAX) = N'{"RowIndex":[1,2], "Data":["a","b"]}';
    
    SELECT RI.[value] AS RowIndex,
           D.[value] AS Data
    FROM OPENJSON(@JSON)
         WITH (RowIndex nvarchar(MAX) AS JSON,
               Data nvarchar(MAX) AS JSON) J
         CROSS APPLY OPENJSON(RowIndex) RI
         CROSS APPLY OPENJSON(Data) D
    WHERE RI.[key] = D.[key];
    

    不过,要详细说明我的 cmets,您似乎应该修复 JSON 设计并具有以下内容:

    [
        {
            "RowIndex": "1",
            "Data": "a",
            "Number": "1"
        },
        {
            "RowIndex": "2",
            "Data": "b",
            "Number": "3"
        }
    ]
    

    哪个更容易查询:

    DECLARE @JSON nvarchar(MAX) = N'[
        {
            "RowIndex": "1",
            "Data": "a",
            "Number": "1"
        },
        {
            "RowIndex": "2",
            "Data": "b",
            "Number": "3"
        }
    ]';
    
    SELECT *
    FROM OPENJSON(@JSON)
         WITH (RowIndex int,
               Data char(1),
               Number int) OJ;
    

    【讨论】:

    • 如果我理解得很好,如果我有 3 个数组就会有 3 个 OPENJSON 等等
    • 正确,@MattiaGiacone 以及您的WHERE 中的更多子句。但是,如果是这种情况,那么真正的问题似乎是 JSON,您的 JSON 应该看起来更像这样(添加了一个额外的节点,Number):[{"RowIndex": "1","Data": "a","Number":"1"},{"RowIndex": "2","Data": "b","Number":"3"}]
    • 如果我能生成像{[{ "RowIndex":0, "Data":"a" },{ "RowIndex":1, "Data":"b" }]}这样的JSON来执行像SELECT JSON_VALUE([value], '$.RowIndex') AS RowIndex, JSON_VALUE([value], '$.Data') AS Data, FROM (SELECT [key],[value],[type] FROM OPENJSON(@jsonstring) )这样的查询会更好
    • 为什么是“垃圾邮件”JSON_VALUE@MattiaGiacone?它更慢(我今天早些时候在another answer 确认了这一点)。
    • 是的,这样更好。真正的 Json 有 12 个数组,对于 250 个元素和 12 个交叉应用,大约需要 1 秒。但如果我以另一种方式创建 json,查询几乎是瞬时的
    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多