T-SQL JSON:JSON_QUERY 在将对象与字符串进行比较后返回 json 字符串

Posted

技术标签:

【中文标题】T-SQL JSON:JSON_QUERY 在将对象与字符串进行比较后返回 json 字符串【英文标题】:T-SQL JSON: JSON_QUERY is returning a json string after comparing the object with a string 【发布时间】: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 对象与某个字符串进行比较时,返回发生了变化... 【参考方案1】:

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

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

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

【讨论】:

以上是关于T-SQL JSON:JSON_QUERY 在将对象与字符串进行比较后返回 json 字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 Json_Query 连接数组值

json_query查询到的Ansible事实如何除法?

sql: JSON_QUERY() 函数提取对象

使用Ansible中的json_query / jmespath过滤器进行多次搜索

如何使用 json 在单个过程中运行 CRUD?(T-SQL)

使用 T-SQL 从 RESTful API 解析 JSON