【问题标题】:How to flatten and transpose a hybrid table in SQL Server 2016 with JSON arrays如何在 SQL Server 2016 中使用 JSON 数组展平和转置混合表
【发布时间】:2018-04-09 08:03:10
【问题描述】:

我有一张桌子,像这样:

| f1 [int] | f2 [int] | jo1 [json object] | ja [json array] |

ja 是一个包含多个 json 对象的数组,结构如下:

[
 {
  "ja_f1": x [int],
  "ja_f2": y [float]
 },
 ...
]

为了简单起见,我们假设 jo1 的结构也像 ja 中的对象

如何将其展平为单个记录?我正在努力做到这一点:

| f1 | f2 | jo1_f1 | jo1_f2 | ja[0]ja_f1 | ja[0]ja_f2 | ... | ja[n]ja_f2 |

我一直在 OPENJSON 上使用 CURSOR 和 CROSS APPLY 来恢复丢失的数据,但它会将其分成几段,这并不是我真正需要的。这是它的样子:

DECLARE @CursorForJSON CURSOR;

声明@JSON nvarchar(MAX); 开始 SET @CursorForJSON = CURSOR FOR 选择 JSON_Query(ja) 来自我的表

OPEN @CursorForJSON
FETCH NEXT FROM @CursorForJSON
INTO @JSON

WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT mt.f1 AS 'f1',
        ja_f1,
        ja_f2
    FROM OPENJSON( @json )
    WITH ( ja_f1 INT '$.ja_f1',
        ja_f2 FLOAT '$.ja_f2')
    CROSS APPLY mytable as mt
    GROUP BY mt.f1, ja_f1, ja_f2
    ORDER BY mt.f1 ASC;
    FETCH NEXT FROM @CursorForJSON
    INTO @JSON
END;

CLOSE @CursorForJSON ;
DEALLOCATE @CursorForJSON;
END;

任何指导将不胜感激

编辑:修正了伪代码中的一些错误

【问题讨论】:

  • 不要,不要,不要。由于您事先不知道结果集的结构,因此这将需要动态 SQL。更糟糕的是,由于结果集的结构无法在中途更改,因此您需要遍历所有数组以找到任何给定数组的最大长度,然后才能开始返回行。强烈考虑将解析这些东西留给客户端(如果必须重复使用此逻辑)或执行诸如将数组作为逗号分隔值提供给稍后由 Excel 之类的东西分隔(如果这是一次性的) .

标签: arrays sql-server json tsql sql-server-2016


【解决方案1】:

我从错误的角度处理这个问题,这就是我想要做的......

SELECT mt.f1 AS 'f1',
    mt.f2 AS 'f2',
    JSON_VALUE(mt.jo1_f1,'$.jo_f1') AS 'jo f1',
    JSON_VALUE(mt.jo1_f2,'$.jo_f2') AS 'jo f2',
    j.ja_f1,
    j.ja_f2
FROM mytable mt
CROSS APPLY OPENJSON( mt.ja ) WITH (
        ja_f1 INT '$.ja_f1',
        ja_f2 FLOAT '$.ja_f2'
    ) j
GROUP BY mt.f1, mt.jo1_f1, mt.jo1_f2, j.ja_f1, j.ja_f2
ORDER BY mt.f1 ASC;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多