json - 将多行中的 JSON 对象合并为单个对象

标签 json sql-server t-sql sql-server-2016 for-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

DB<>Fiddle

我想得到如下输出:

{
  "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

Demo on db<>fiddle

关于json - 将多行中的 JSON 对象合并为单个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59087080/

相关文章:

javascript - php 中的 MySql 查询仅在以 json 编码时返回最后的结果

c# - 如何构造指定精度和小数位数的 SqlDecimal 数据类型的实例

sql-server - Sql Server 谓词惰性?

sql - 如何获取SQL Server表中具有最大值的所有记录

json - 如何解码json

json - 您应该省略 API 中的空字段吗?

sql-server - 表变量中的表数据类型

sql - 使用 row_number() 通过分区生成计算列

sql - 查看任何定义、查看服务器状态的风险

json - 如果嵌套内容使用动态键,我如何在 GoLang 中解析 JSON?