如何返回嵌套的JSON数组

时间:2019-12-04 11:25:29

标签: sql json sql-server

我有一个3列的表格,如图1所示。

图片1:Pic1

我的目标是将嵌套数组作为JSON字符串返回:

"[
   [7157688981.272619,7290098.188727271,null,null,null,null,null], 
   [9331221970.409422,-187354647.1071058,2949162.807512622,null,null,null,null], 
   [11015646818.20274,-482410203.4928556,14040634.58841678,-112035.0684939814,null,null,null], 
   ...
 ]"

(在这种情况下,1个数组包装6个数组,每个数组包含7个浮点数/空值)

我使用以下查询设法在Pic2上显示了结果:

图片2:Pic2

SELECT FF,
       [0] AS DO0 ,
       [1] AS DO1 ,
       [2] AS DO2 ,
       [3] AS DO3 ,
       [4] AS DO4 ,
       [5] AS DO5 ,
       [6] AS DO6
FROM ( 
    SELECT TOP 36 FF, DO, Value
    FROM MyTable WITH (NOLOCK)
    WHERE Id = 100
    ORDER BY FF, DO
) AS SourceTable 
PIVOT ( 
MAX(value)
    FOR DO IN ([0], [1], [2], [3], [4], [5], [6]) 
) AS PivotTable

添加FOR JSON AUTO可以得到以下结果,即我离期望的结果越近:

"[
  {
    "FF": 0,
    "DO0": 8099996673.580311,
    "DO1": -11940671.04204195
  },
  {
    "FF": 1,
    "DO0": 10575727464.91492,
    "DO1": -233647906.0869318,
    "DO2": 3359200.530983179
  },
  {
    "FF": 2,
    "DO0": 11693775141.49235,
    "DO1": -429492903.0961588,
    "DO2": 10721235.27578629,
    "DO3": -74363.98732124352
  },
  ...
]"

有人可以给我一些指导吗?非常感谢。


编辑:添加示例数据:

|  FF |      D0 |      D1 |         D2 |       D3 |      D4 |    D5 |   D6 |
|:---:|--------:|--------:|-----------:|---------:|--------:|------:|-----:|
|  0  |  809973 |   -1191 |       NULL |     NULL |    NULL |  NULL | NULL |
|  1  | 1057564 |  -23366 |    3359200 |     NULL |    NULL |  NULL | NULL |
|  2  | 1169341 |  -42943 |    1079235 |   -74363 |    NULL |  NULL | NULL |
|  3  | 1071256 |  -15127 |   -7915416 |   362620 |   -3310 |  NULL | NULL |
|  4  | 1409215 | -153899 |   13408335 | -5336555 |   93451 |  -586 | NULL |
|  5  | -328619 |  804878 | -125937545 |   774136 | -226559 | 30247 | -155 |

1 个答案:

答案 0 :(得分:0)

编辑2:这是我发现的解决方案:

DECLARE @json NVARCHAR(MAX) = (
        SELECT [0] AS D0
                 , [1] AS D1
                 , [2] AS D2
                 , [3] AS D3
                 , [4] AS D4
                 , [5] AS D5
                 , [6] AS D6

        FROM (
            SELECT TOP 36 FF, DO, Value
            FROM MyTable WITH (NOLOCK)
            WHERE Id = @Id
      ORDER BY FF, DO
        ) AS SourceTable
        pivot
        (
            MAX(value)
            FOR DO IN ([0], [1], [2], [3], [4], [5], [6])
        ) AS PivotTable for JSON AUTO
);

set @json = (SELECT REPLACE((select @json as json), '{', '['));
set @json = (SELECT REPLACE((select @json as json), '}', ']'));

set @json = (SELECT REPLACE((select @json as json), '"D0":', ''));
set @json = (SELECT REPLACE((select @json as json), '"D1":', ''));
set @json = (SELECT REPLACE((select @json as json), '"D2":', ''));
set @json = (SELECT REPLACE((select @json as json), '"D3":', ''));
set @json = (SELECT REPLACE((select @json as json), '"D4":', ''));
set @json = (SELECT REPLACE((select @json as json), '"D5":', ''));
set @json = (SELECT REPLACE((select @json as json), '"D6":', ''));

RETURN @json;

结果:

[
  [
    8099996673.580311,
    -11940671.04204195
  ],
  [
    10575727464.91492,
    -233647906.0869318,
    3359200.530983179
  ],
  [
    11693775141.49235,
    -429492903.0961588,
    10721235.27578629,
    -74363.98732124352
  ],
  [
    10712544156.84927,
    -151227127.4954886,
    -7915416.297312453,
    362620.9659495770,
    -3310.492070233489
  ],
  [
    14092371615.84298,
    -1538992059.857372,
    134808335.5258479,
    -5336555.181154305,
    93451.37357258648,
    -586.4355493504229
  ],
  [
    -3286355419.227318,
    8048710298.354312,
    -1251937545.910397,
    77054136.25657171,
    -2226559.780061883,
    30247.00533798033,
    -155.7244489259102
  ]
]

感谢@JeroenMostert的提示!