仅当 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, Field2
,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, Field2
,CASE WHEN 0 < 1 THEN JSON_QUERY('[' + json.CrossApplyQuery + ']', '$') ELSE NULL END AS [Returns_JSON]
返回:
Field1 | Field2 | Returns_JSON
Value1 | Value2 | [{"SomeQueryField":"SomeStringValue"]}]
问题:如何检查 JSON 是否包含字段/属性而不将其更改为字符串?