【发布时间】: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