格式只有查询结果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中查询和获取结果?

+0

你的情况是什么?也许你可以用Python查询Azure SQL数据库并从那里生成新的JSON字符串。 –

+0

@EstienneGranet由于限制,我只能使用T-SQL。你知道通过查询来达到这个目的吗? – Alfan

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; 
+0

工作正常!谢谢Estienne! – Alfan

+0

请将upvote如果有用的答案! –