json - 将来自多行的 JSON 对象组合成一个对象
问题描述
CREATE TABLE t(Id int, typee nvarchar(50), jsonStr nvarchar(max));
INSERT INTO t(Id, typee, jsonStr) VALUES
(3786, 'APV', '{"1":1,"3":3,"4":24,"5":95}'),
(3786, 'VN', '{"1":3,"5":25}');
-- Expected result
-- {"APV": {"1":1,"3":3,"4":24,"5":95}, "VN":{"1":3,"5":25} }
SELECT Id,(
SELECT CASE WHEN typee = 'VN' THEN jsonStr END AS [VN]
, CASE WHEN typee = 'VO' THEN jsonStr END AS [VO]
, CASE WHEN typee = 'APV' THEN jsonStr END AS [APV]
FROM t AS x
WHERE x.Id = t.Id
FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER
) AS TEST1
FROM t
GROUP BY Id
我想得到如下输出:
{
"APV": {
"1": 1,
"3": 3,
"4": 24,
"5": 95
},
"VN": {
"1": 3,
"5": 25
}
}
解决方案
FOR JSON
将字符串视为字符串,即使它表示有效的 JSON。您需要使用JSON_QUERY
将 JSON 字符串转换为实际的 JSON 对象。MIN
需要将多行合并为一:
SELECT Id, (
SELECT JSON_QUERY(MIN(CASE WHEN typee = 'APV' THEN jsonStr END)) AS [APV]
, JSON_QUERY(MIN(CASE WHEN typee = 'VN' THEN jsonStr END)) AS [VN]
, JSON_QUERY(MIN(CASE WHEN typee = 'VO' THEN jsonStr END)) AS [VO]
FROM t AS x
WHERE x.id = t.id
FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER
)
FROM t
GROUP BY Id
推荐阅读
- javascript - 如何在 React 中调用全局函数?
- c++ - 如何修复级别顺序遍历问题(二叉树)的这个无限循环错误
- ios - 将值传递给另一个类并将其显示在该视图控制器上
- resolution - PineScript 中是否有计算下一个上时间帧分辨率柱的持续柱数的函数?
- typescript - 在 tsconfig.json 中使用 include 时排除 node_module?
- html - Favicon 未在 chrome 中显示
- javascript - 导入语句中的“SyntaxError:意外的标识符”?
- r - 如何获得 R 中 2 列是/否数据的摘要?
- c++ - 如何输入以特殊字符开头的字符串
- kubernetes - Kubernetes - 在污点/容忍度上启用自动 pod 重新调度