格式只有查询结果JSON在SQL Server
我有有一个JSON列“JsonVal” &其他一些列格式只有查询结果JSON在SQL Server
Name Id Group JsonVal
----------------------------------------------------------
Name1 2 gg1 {"LogLevel":"2", "InfoLevel":"3"}
Name2 3 gg5 {"LogLevel":"4"}
在JsonVal解析,使数据的意义后一个SQL表X的一部分专栏中,我想从表X读这样,我得到的结果是这样的方式我想, :
Name Id Features
----------------------------------------------------------
Name1 2 {"HasLogLevel":"True", "LogLevel":"2", "HasInfoLevel":"True"}
Name2 3 {"HasLogLevel":"True", "LogLevel":"4", "HasInfoLevel":"False"}
我不能找到一种方法,只是我列JSON的一部分转换。 如果我在这样的查询做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
它把所有的列(包括姓名,身份证)到JSON。但我只想在结果中将3列HasLogLevel,LogLevel和HasInfoLevel格式化为JSON
有没有一种方法可以在单个查询中以我想要的方式在SQL Server中查询和获取结果?
FOR JSON PATH
适用于查询的整个结果,因此您不能在单个SELECT
语句中组合JSON类数据和非类JSON数据。使用子查询来专门创建JSON,然后使用别名将其与其他列进行匹配。
此方法在Id
列上需要UNIQUE
/PRIMARY KEY
约束,以便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;
工作正常!谢谢Estienne! – Alfan
请将upvote如果有用的答案! –
你的情况是什么?也许你可以用Python查询Azure SQL数据库并从那里生成新的JSON字符串。 –
@EstienneGranet由于限制,我只能使用T-SQL。你知道通过查询来达到这个目的吗? – Alfan