如何使用带有交叉应用的 SQL OPENJSON 函数测量 json 文件中数组内数组的长度

Posted

技术标签:

【中文标题】如何使用带有交叉应用的 SQL OPENJSON 函数测量 json 文件中数组内数组的长度【英文标题】:how to measure length of array inside array in json file using SQL OPENJSON function with cross APPLY 【发布时间】:2021-01-05 15:26:32 【问题描述】:
    "table":  [
                   
                       "name":  "Emergency",
                       "columns":  [
                                       
                                           "name":  "ab",
                                           "type":  "long"
                                       ,
                                       
                                           "name":  "cd",
                                           "type":  "long"
                                       ,
                                       
                                           "name":  "ef",
                                           "type":  "long"
                                       ,
                                       
                                           "name":  "gh",
                                           "type":  "long"
                                       ,
                                       
                                   ],
                       "rows":  [
                                    [                                                                             
                                        0.55865,
                                        2.0966,
                                        0.4280,
                                        1.4389
                                    ],
                                    [
                                        
                                        0.42490,
                                        1.5723,
                                        0.3601,
                                        0.8031
                                    ]
                                ]
                   
               ]

所以在这个 json 中,行内的数组对象可以是多个(超过 2 个)。那么如何使用 OPENJSON SQL Server 函数计算数组 sinde 'rows' 的对象。

我所做的是,将此json存储到临时表#TempAb中,然后

 DECLARE @ab VARCHAR(MAX);
 DECLARE @cd VARCHAR(MAX);
 DECLARE @ef VARCHAR(MAX);
 DECLARE @gh VARCHAR(MAX);
SELECT @ab=ab,@cd=cd,@ef=ef,@gh=gh from #TempAb as ab CROSS APPLY
                            OPENJSON(ab.RawData, '$.table') WITH
                            (
                            ab Varchar(MAX) '$.rows[0][0],
                            cd Varchar(Max) '$.rows[0][1],
                            ef Varchar(Max) '$.rows[0][2],
                            gh Varchar(Max) '$.rows[0][3]
);                 

所以这个查询只返回行的第一个对象的数据,但我想要所有行对象的数据。所以我知道计数然后在while循环中迭代它

解决方案:


SET @cnt_total = (SELECT  COUNT(O.[key]) FROM (VALUES(@jsonvalue))V(J)
                                CROSS APPLY OPENJSON(V.J)
                                WITH([Object] nvarchar(MAX) '$.table[0].rows' AS JSON) M
                                CROSS APPLY OPENJSON(M.[Object]) O) 

【问题讨论】:

【参考方案1】:

首先你必须从有效的 JSON 开始,然后是这样的:

declare @json nvarchar(max) = N'

    "table":  [
                   
                       "name":  "Emergency",
                       "columns":  [
                                       
                                           "name":  "ab",
                                           "type":  "long"
                                       ,
                                       
                                           "name":  "cd",
                                           "type":  "long"
                                       ,
                                       
                                           "name":  "ef",
                                           "type":  "long"
                                       ,
                                       
                                           "name":  "gh",
                                           "type":  "long"
                                       
                                       
                                   ],
                       "rows":  [
                                    [                                                                             
                                        0.55865,
                                        2.0966,
                                        0.4280,
                                        1.4389
                                    ],
                                    [
                                        
                                        0.42490,
                                        1.5723,
                                        0.3601,
                                        0.8031
                                    ]
                                ]
                   
               ]

'


select count(*) from 
OPENJSON(@json, '$.table[0].rows') d

【讨论】:

以上是关于如何使用带有交叉应用的 SQL OPENJSON 函数测量 json 文件中数组内数组的长度的主要内容,如果未能解决你的问题,请参考以下文章

如何从 OPENJSON 获取多列值并交叉应用

SSDT - 交叉应用 OPENJSON

如何反转 SQL Server 中的 OPENJSON() 函数?

如何实现 OPENJSON 将 JSON 代码作为列中的文本。如何在 AZURE SQL Dataware House 中的表列上使用 OPENJSON?

如何使用 openjson 读取存储在 SQL Server 中的 Json 列下方?

如何从 Azure SQL 数据库中的 Blob 解析 Json