在SQL Server中仅将查询结果的一部分格式化为JSON

时间:2017-10-10 22:05:46

标签: sql sql-server json sql-server-2012 azure-sql-database

我有一个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

有没有办法在单个查询中以我想要的方式查询和获取结果?

1 个答案:

答案 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;
相关问题