在SQL Server中,仅将部分查询结果格式化为JSON
我有一个SQL表X,它有一个JSON列“JsonVal”&其他几列在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列中
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。您知道通过查询实现这一点的方法吗?