我有一个SQL表X,它有一个JSON列'JsonVal'&其他几个专栏
Name Id Group JsonVal
----------------------------------------------------------
Name1 2 gg1 {"LogLevel":"2", "InfoLevel":"3"}
Name2 3 gg5 {"LogLevel":"4"}
按照我想要的方式解析并理解JsonVal列中的数据后, 我想从表X中读取这样的结果:
Name Id Features
----------------------------------------------------------
Name1 2 {"HasLogLevel":"True", "LogLevel":"2", "HasInfoLevel":"True"}
Name2 3 {"HasLogLevel":"True", "LogLevel":"4", "HasInfoLevel":"False"}
我无法找到将我的部分列转换为JSON的方法。 如果我在这样的查询中执行FOR JSON:
SELECT Name,Id,
HasLogLevel = CASE WHEN JSON_VALUE(JsonVal,'$."LogLevel"') IS NOT NULL THEN 'True' ELSE 'False' END,
LogLevel = CASE WHEN JSON_VALUE(JsonVal,'$."LogLevel"') IS NULL THEN 'NO-VALUE' ELSE JSON_VALUE(JsonVal,'$."LogLevel"') END,
HasInfoLevel = CASE WHEN JSON_VALUE(JsonVal,'$."InfoLevel"') IS NOT NULL THEN 'True' ELSE 'False' END
FROM X FOR JSON PATH
它将所有列(包括Name,Id)转换为JSON。但我只想在结果中将3列HasLogLevel,LogLevel和HasInfoLevel格式化为JSON
有没有办法在单个查询中以我想要的方式查询和获取结果?
答案 0 :(得分:1)
FOR JSON PATH
适用于查询的整个结果,因此您无法在单个SELECT
语句中组合类似JSON的数据和非类JSON数据。使用子查询以专门创建JSON,然后使用别名将其与其他列匹配。
此方法在UNIQUE
列上需要PRIMARY KEY
/ Id
约束,以便WHERE
子句一次只返回一个结果。
SELECT T1.[Name], T1.[Id],
( SELECT HasLogLevel = CASE WHEN JSON_VALUE(JsonVal,'$."LogLevel"') IS NOT NULL THEN 'True' ELSE 'False' END,
LogLevel = CASE WHEN JSON_VALUE(JsonVal,'$."LogLevel"') IS NULL THEN 'NO-VALUE' ELSE JSON_VALUE(JsonVal,'$."LogLevel"') END,
HasInfoLevel = CASE WHEN JSON_VALUE(JsonVal,'$."InfoLevel"') IS NOT NULL THEN 'True' ELSE 'False' END
FROM TestTable AS T2
WHERE T2.[Id] = T1.[Id]
FOR JSON PATH) AS Features
FROM TestTable AS T1;