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

问题描述

    "table":  [
                   {
                       "name":  "Emergency","columns":  [
                                       {
                                           "name":  "ab","type":  "long"
                                       },{
                                           "name":  "cd",{
                                           "name":  "ef",{
                                           "name":  "gh",],"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) 

解决方法

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

declare @json nvarchar(max) = N'
{
    "table":  [
                   {
                       "name":  "Emergency","columns":  [
                                       {
                                           "name":  "ab","type":  "long"
                                       },{
                                           "name":  "cd",{
                                           "name":  "ef",{
                                           "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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...