You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server使用OPENJSON查询嵌套JSON多条件匹配行的方法

问题根因

原SQL返回空结果是逻辑判断错误:OPENJSON(chave)会把chave存储的JSON数组拆分为独立的行,每行对应数组内的一个JSON对象。你在子查询中要求单条拆分后的记录同时满足NomeCampo = 'id'和NomeCampo = 'id2',这个条件永远不可能成立——单条记录的NomeCampo只会有一个值,不可能同时等于两个不同字符串。

可行写法

需求完全可以实现,以下两种常用写法都能准确返回目标的第3行记录:

写法1:双EXISTS校验

逻辑最直观,分别判断两个目标键值对是否存在,性能表现更好:

SELECT id, id_modulo, chave
FROM myTable
WHERE id_modulo = 17
  AND EXISTS (
      SELECT 1
      FROM OPENJSON(chave)
      WITH (
          NomeCampo nvarchar(100) '$.NomeCampo',
          Valor int '$.Valor'
      ) AS Info
      WHERE Info.NomeCampo = 'id' AND Info.Valor = 3
  )
  AND EXISTS (
      SELECT 1
      FROM OPENJSON(chave)
      WITH (
          NomeCampo nvarchar(100) '$.NomeCampo',
          Valor int '$.Valor'
      ) AS Info
      WHERE Info.NomeCampo = 'id2' AND Info.Valor = 5
  )

写法2:匹配计数校验

适合需要同时匹配多个键值对的场景,写法更简洁:拆分JSON后统计符合目标条件的记录数,计数等于条件总数就说明所有条件都满足。

SELECT id, id_modulo, chave
FROM myTable
WHERE id_modulo = 17
  AND (
      SELECT COUNT(*)
      FROM OPENJSON(chave)
      WITH (
          NomeCampo nvarchar(100) '$.NomeCampo',
          Valor int '$.Valor'
      ) AS Info
      WHERE (Info.NomeCampo = 'id' AND Info.Valor = 3)
         OR (Info.NomeCampo = 'id2' AND Info.Valor = 5)
  ) = 2

注意:原写法中将Valor字段映射为nvarchar(max)类型,实际JSON中存储的是数值类型,直接映射为int类型做比较可以避免隐式转换导致的匹配错误,查询效率也更高。

内容的提问来源于stack exchange,提问作者RSilva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 02:15:28