【发布时间】:2020-11-06 14:12:35
【问题描述】:
仅当 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 是否包含字段/属性而不将其更改为字符串?
【问题讨论】:
-
JSON 是一个字符串;通常是
nvarchar(MAX)。你的意思是你如何阅读它而不把它变成一个?您实际上是将其存储在varbinary中吗? -
我知道 Json 本质上是一个字符串... ,只是返回...当我将 json 对象与某个字符串进行比较时,返回发生了变化...
标签: sql tsql sql-server-2017 json-query open-json