SQL查询中如何不使用IF ELSE动态跳过WHERE子句条件?
动态条件SQL单查询实现方案
核心思路:通过OR逻辑组合互斥的判断分支,无需IF ELSE分支即可实现二选一的条件过滤,完全匹配你原有业务逻辑。
正确实现代码
DECLARE @search_text varchar(50)='', @start_date datetime, @end_date datetime; SELECT * FROM Table1 WHERE -- 搜索文本为空时触发日期范围过滤 (ISNULL(@search_text, '') = '' AND CONVERT(DATE, Mydate) BETWEEN CONVERT(DATE, @start_date) AND CONVERT(DATE, @end_date)) OR -- 搜索文本非空时触发模糊匹配 (ISNULL(@search_text, '') <> '' AND column1 LIKE '%' + @search_text + '%') -- 可选:大数据量场景添加重编译提示,解决OR逻辑导致的索引失效问题 -- OPTION (RECOMPILE)
原有CASE WHEN写法失效原因
你之前的CASE WHEN写法失效的核心原因是:当@search_text不为空时,CASE语句没有匹配分支会返回NULL,而NULL BETWEEN 日期A AND 日期B的运算结果为UNKNOWN,会被WHERE子句直接过滤,因此非空搜索场景下永远查不到数据,不符合需求。
优化建议
- 原有日期处理逻辑将
Mydate转为字符串再对比性能更低,且存在日期格式不匹配的潜在风险,改为直接转为DATE类型对比即可。 - 如果表数据量较大,可打开注释中的
OPTION (RECOMPILE)配置,让数据库每次执行时根据变量实际值生成最优执行计划,避免OR逻辑导致的全表扫描问题。
内容的提问来源于stack exchange,提问作者BJ Coder
相关产品推荐
相关产品推荐

