Sql-Server
為什麼 CASE 語句中的 JSON_QUERY 無法刪除轉義字元?
如果在語句中應用該函式,則似乎
json_query
無法刪除雙引號字元 (") 的轉義字元。case
下面的範常式式碼。
declare @data nvarchar(max); declare @debug int = 0; set @data = '{"id":10}'; set @debug = 0; select isjson(@data) as 'validateData', @data as 'unprocessedSourceData', json_query(@data) as 'processedSourceData', case when @debug = 1 then json_query(@data) else null end as 'conditionallyProcessedSourceData' for json path, without_array_wrapper ; set @debug = 1; select isjson(@data) as 'validateData', @data as 'unprocessedSourceData', json_query(@data) as 'processedSourceData', case when @debug = 1 then json_query(@data) else null end as 'conditionallyProcessedSourceData' for json path, without_array_wrapper ;
第一個查詢的結果:
{"validateData":1,"unprocessedSourceData":"{\"id\":10}","processedSourceData":{"id":10}}
第二個查詢的結果:
{"validateData":1,"unprocessedSourceData":"{\"id\":10}","processedSourceData":{"id":10},"conditionallyProcessedSourceData":"{\"id\":10}"}
注意最後的轉義字元:“
{\"id\":10}
”1)為什麼會這樣?
2)我如何重新處理這個查詢,以便如果
@debug = 1
元素conditionallyProcessedSourceData
包含有效的 JSON,並且如果@debug = 0
元素是null
?
返回 nvarchar(max) 類型的 JSON 片段。
和
JSON_QUERY 返回一個有效的 JSON 片段。因此,FOR JSON 不會轉義 JSON_QUERY 返回值中的特殊字元。
所以
for json path
轉義nvarchar(max)
數據,除非nvarchar(max)
數據來自json_query()
.在您的查詢中,數據來自 case 語句,而不是直接來自
json_query
.您可以做的解決方法是放在
json_query
機箱外。json_query(case when @debug = 1 then @data else null end)
將其合併到您的完整腳本中,以便您可以比較不同的方法,給出:
declare @data nvarchar(max); declare @debug int = 0; set @data = '{"id":10}'; set @debug = 0; select isjson(@data) as 'validateData', @data as 'unprocessedSourceData', json_query(@data) as 'processedSourceData', case when @debug = 1 then json_query(@data) else null end as 'conditionallyProcessedSourceData', json_query(case when @debug = 1 then @data else null end) as 'caseResultProcessed' for json path, without_array_wrapper ; set @debug = 1; select isjson(@data) as 'validateData', @data as 'unprocessedSourceData', json_query(@data) as 'processedSourceData', case when @debug = 1 then json_query(@data) else null end as 'conditionallyProcessedSourceData', -- This was the issue json_query(case when @debug = 1 then @data else null end) as 'caseResultProcessed' -- This is the solution for json path, without_array_wrapper ;