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

在SQL Server中,仅将部分查询结果格式化为JSON,sql,sql-server,json,sql-server-2012,azure-sql-database,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列中

我有一个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"}
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
我无法找到一种方法将我的部分列转换为JSON。 如果我在这样的查询中对JSON执行以下操作:

Name      Id    Features
----------------------------------------------------------
Name1      2     {"HasLogLevel":"True", "LogLevel":"2", "HasInfoLevel":"True"}
Name2      3     {"HasLogLevel":"True", "LogLevel":"4", "HasInfoLevel":"False"}
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
它将所有列(包括名称、Id)转换为JSON。但我只希望结果中的3列HasLogLevel、LogLevel和HasInfoLevel被格式化为JSON


是否有一种方法可以在SQL Server中以我希望的方式在单个查询中查询和获取结果?

FOR JSON PATH
适用于整个查询结果,因此不能在单个
SELECT
语句中组合类似JSON的数据和非类似JSON的数据。使用子查询专门创建JSON,然后使用别名将其与其他列匹配

此方法要求对
Id
列使用
UNIQUE
/
主键
约束,以便
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;

你的设想是什么?也许您可以使用Python查询Azure SQL数据库,并从中生成新的JSON字符串。@EstienneGranet由于限制,我只能使用T-SQL。您知道通过查询实现这一点的方法吗?