问题描述
仅当JSON包含特定字段/属性时,我才尝试返回JSON_QUERY字段,但是当我将其与字符串(即字段名称)进行比较时,该函数不会返回JSON ...
单个代码没有比较:
SELECT Field1,Field2,JSON_QUERY('[' + json.CrossApplyQuery + ']','$') AS [Returns_JSON]
返回:
Field1 | Field2 | Returns_JSON
Value1 | Value2 | [{"SomeQueryField":"SomeStringValue"]}]
使用JSON进行比较的代码:
SELECT Field1,CASE WHEN CHARINDEX('_JsonProperty',UPPER(json.CrossApplyQuery)) > 0 THEN JSON_QUERY('[' + json.CrossApplyQuery + ']','$') ELSE NULL END AS [Returns_String],CASE WHEN Exists(Select * FROM OPEnjsON(JSON_QUERY('[' + json.CrossApplyQuery + ']','$'),'$') WHERE value like '%_JsonProperty%') THEN JSON_QUERY('[' + json.CrossApplyQuery + ']','$') ELSE NULL END AS [Returns_String_Too]
返回:
Field1 | Field2 | Returns_String | Returns_String_Too
Value1 | Value2 | "[{\"SomeQueryField\":\"SomeStringValue\"}] | "[{\"SomeQueryField\":\"SomeStringValue\"}]
如果我不使用JSON字段进行比较(任何其他条件),则可以使用!
SELECT Field1,CASE WHEN 0 < 1 THEN JSON_QUERY('[' + json.CrossApplyQuery + ']','$') ELSE NULL END AS [Returns_JSON]
返回:
Field1 | Field2 | Returns_JSON
Value1 | Value2 | [{"SomeQueryField":"SomeStringValue"]}]
问题:如何检查JSON是否包含字段/属性而不将其更改为字符串?
解决方法
问题通过以下方式解决:
JSON_QUERY('[' + CASE WHEN CHARINDEX('_JsonProperty',UPPER(json.CrossApplyQuery)) > 0 THEN json.CrossApplyQuery ELSE NULL END + ']','$') [Returns_JSON]
不知道为什么,但是它起作用了... 谢谢!