SQL Server 2016中用JSON_QUERY查询含指定Inquiry ID的记录ID
解决SQL Server中筛选JSON数组包含指定值的问题
嘿,这个需求其实用SQL Server自带的JSON处理函数就能轻松搞定,我给你两种实用的方法,你可以根据自己的场景来选择:
方法1:使用JSON_CONTAINS(简洁直接)
JSON_CONTAINS是SQL Server专门用来检查JSON数据中是否包含指定值的函数,对你的场景来说非常适配,代码写起来也很清爽:
SELECT CONTENT_RULE_ID FROM YourTableName WHERE ISJSON(CONTENT_RULE) = 1 -- 先过滤无效JSON,避免查询报错 AND JSON_CONTAINS(CONTENT_RULE, '1', '$.Values')
小说明:
ISJSON(CONTENT_RULE) = 1:提前筛掉格式错误的JSON数据,防止查询过程中抛出异常。JSON_CONTAINS的三个参数分别是:要检查的JSON字段、目标匹配值(这里是数字1,不用加引号;如果是字符串则需要写成'"1"')、指定检查的JSON路径$.Values(也就是CONTENT_RULE里的Values数组)。
方法2:使用OPENJSON展开数组(灵活扩展)
如果之后你需要对Values数组的元素做更多处理(比如筛选多个值、做计算等),可以用OPENJSON把数组拆成逐行记录,再进行筛选:
SELECT DISTINCT t.CONTENT_RULE_ID FROM YourTableName t CROSS APPLY OPENJSON(t.CONTENT_RULE, '$.Values') AS j WHERE ISJSON(t.CONTENT_RULE) = 1 AND CAST(j.value AS INT) = 1 -- 转成INT类型严格匹配数字1,避免字符串隐式转换问题
小说明:
CROSS APPLY OPENJSON(...):把每条数据里的Values数组拆成单独的行,每行对应数组里的一个元素。DISTINCT:确保同一个CONTENT_RULE_ID即使数组里多次出现1,也只会返回一次。- 这里把
j.value转成INT再比较,是因为OPENJSON默认返回的是字符串类型,这样能保证数字匹配的准确性。
记得把代码里的YourTableName替换成你的实际表名,直接运行就能得到你要的结果啦。
内容的提问来源于stack exchange,提问作者Harisyam M
相关产品推荐
相关产品推荐

