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

如何在EXISTS中添加OR条件?SQL Server查询为何未正确过滤年份?

问题根因

你遇到的问题是SQL逻辑运算符优先级规则导致的:SQL 中AND运算符的优先级远高于OR,你写的查询条件没有主动加括号调整运算顺序,实际执行时的逻辑等价于以下代码:

WHERE 
  -- 只要Person字段包含指定姓名,不管年份是否符合都会被匹配
  EXISTS (Select * from string_split(Person,',') WHERE value in (@Person))
OR 
  (
    EXISTS (Select * from string_split(Name2,',') WHERE value in (@Person))
    AND Year_N = @Date
  )

2000年的那条记录Person字段拆分后存在值Mike,满足第一个条件,所以直接被返回,不会校验年份是否为2020,这就是查询结果包含两个年份记录的原因。

修复方法

将两个姓名匹配的条件用括号包裹为一个逻辑组,再和年份条件做AND运算即可:

DECLARE @Person NVARCHAR(100) = 'Mike',
        @Date int = 2020

SELECT *
FROM [dbo].[Person_Table]
WHERE 
  -- 括号保证两个姓名条件先做OR运算,再和年份条件匹配
  (
    EXISTS (Select * from string_split(Person,',') WHERE value = @Person)
    OR EXISTS (Select * from string_split(Name2,',') WHERE value = @Person)
  )
  AND Year_N = @Date

小优化:你的查询中IN (@Person)只有单个匹配值,直接用=运算符性能和可读性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:42:03