【问题标题】:SQL IN or NOT IN depending on boolean parameterSQL IN 或 NOT IN 取决于布尔参数
【发布时间】:2026-01-25 12:05:01
【问题描述】:

我有一个 java 布尔参数,它应该告诉我是检查值 IN (x,y,z) 还是 NOT IN (x,y,z)(基于真/假)。我如何将“NOT”插入到 SQL 查询中?我应该使用简单的 String.replaceAll() 还是编写不同的查询?哪个是最优的?

【问题讨论】:

  • IN 列表中有空值吗?
  • 写一个不同的查询。否则你最终会写一个"catch all query"
  • 是的,如何检查空 IN()?如果 IN() 是唯一的条件,可能会忽略 WHERE?
  • WHERE col IN() 将是无效的 SQL 和不同的问题。对于“catch all”路线,您可以简单地将-1 添加到该列表中,这样它就永远不会为空并且-1 不会匹配任何记录......但我不鼓励这样做。如果您想要最佳,请使用不同的查询。

标签: java sql sql-server


【解决方案1】:

一种选择是编写一个带有参数的查询。您可以将条件表示为:

select t.*
from t
where (@flag = 1 and x in (1, 2, 3)) or
      (@flag = 0 and x not in (1, 2, 3));

对于性能,我认为union all 更好:

select t.*
from t
where @flag = 1 and x in (1, 2, 3)
union all
select t.*
from t
where @flag = 0 and x not in (1, 2, 3);

当然,在java中,你可以只使用两个查询:

if flag then sql = . . . 
else sql = . . . ;

然后一步执行sql。

【讨论】:

  • 如果使用前者,您可能希望包含RECOMPILE 选项,因为这两个查询的查询计划可能完全不同。如果这不是一个选项(由于使用旧版本的 SQL Server),那么您可能想要使用动态 SQL。不过我同意,处理在 java 中运行的查询可能是更好的选择。