2017-10-10 43 views
0

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

回答

1

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如果有用的答案! –