0

仅当 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 是否包含字段/属性而不将其更改为字符串?

4

1 回答 1

0

使用这种方式解决的问题:

JSON_QUERY('[' + CASE WHEN CHARINDEX('_JsonProperty', UPPER(json.CrossApplyQuery)) > 0 THEN json.CrossApplyQuery ELSE NULL END + ']', '$') [Returns_JSON]

不知道为什么,但它起作用了...... Tks!

于 2020-11-06T15:51:09.600 回答