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

如何修复SQL Server 2016+中多JSON键AND查询无结果的问题

修复SQL Server 2016+中OPENJSON多键AND查询的异常

问题原因

OPENJSON会将JSON列中的每个键值对拆分为单独的行,同一行记录不可能同时包含key='Name'和key='Guid',因此直接在WHERE子句中用AND连接两个键值条件时,永远不会有匹配的行,导致无结果返回。

修复方案

方案1:使用多个EXISTS子查询分别验证每个键值对

通过两个独立的EXISTS,分别检查JSON中是否存在符合条件的Name和Guid键值对,只有当两个条件都满足时才返回记录:

SELECT * 
FROM [Logs] t
WHERE EXISTS (  
   SELECT 1
   FROM OPENJSON(t.[Parameters])
   WHERE [key] = 'Name' AND [value] = 'Test'
)
AND EXISTS (  
   SELECT 1
   FROM OPENJSON(t.[Parameters])
   WHERE [key] = 'Guid' AND [value] = '37aaecc3-e2f9-4b39-afcf-ba720c4e500a'
)

方案2:统计匹配的唯一键数量

利用COUNT(DISTINCT [key])统计满足条件的键的数量,确保两个目标键都匹配:

SELECT * 
FROM [Logs] t
WHERE EXISTS (  
   SELECT 1
   FROM OPENJSON(t.[Parameters])
   WHERE ([key] = 'Name' AND [value] = 'Test') 
      OR ([key] = 'Guid' AND [value] = '37aaecc3-e2f9-4b39-afcf-ba720c4e500a')
   HAVING COUNT(DISTINCT [key]) = 2
)

方案3:直接使用JSON_VALUE(SQL Server 2016+支持)

SQL Server 2016及以上版本本身支持JSON_VALUE函数,写法更简洁,无需依赖OPENJSON,效果和2022版本的逻辑一致(可通过JSON_VALUE(...) IS NOT NULL替代JSON_PATH_EXISTS检查键是否存在):

SELECT *
FROM Logs
WHERE
    JSON_VALUE([Parameters], '$.Name') IS NOT NULL AND
    JSON_VALUE([Parameters], '$.Guid') IS NOT NULL AND
    JSON_VALUE([Parameters], '$.Name') = 'Test' AND
    JSON_VALUE([Parameters], '$.Guid') = '37aaecc3-e2f9-4b39-afcf-ba720c4e500a';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:47:20