如何在WHERE子句的CASE中实现多条件判断?
解决你的SQL查询条件问题
没问题,我来帮你搞定这个需求!你原来的CASE写法在部分SQL方言里可能会因为布尔值的处理逻辑出错,不过不用UNION也完全可以用单个查询实现,而且有两种更稳妥的方式:
方法一:用AND/OR组合逻辑条件(推荐)
这种写法逻辑清晰、可读性强,而且数据库的查询优化器更容易生成高效的执行计划:
SELECT * FROM tbl WHERE (col1 = 'W' AND colA IN ('1','2')) OR (col1 != 'W' AND colB IN ('1','2'))
简单解释下:
- 当
col1等于'W'时,只会触发第一个条件组,验证colA是否在目标集合里 - 当
col1不等于'W'时,触发第二个条件组,验证colB是否在目标集合里
方法二:修正CASE表达式写法
如果你更倾向于用CASE结构,可以把CASE的返回值改成数据库能直接判断的数值(比如1/0),然后在WHERE里判断等于1:
SELECT * FROM tbl WHERE CASE WHEN col1 = 'W' THEN CASE WHEN colA IN ('1','2') THEN 1 ELSE 0 END ELSE CASE WHEN colB IN ('1','2') THEN 1 ELSE 0 END END = 1
这种写法本质上和方法一逻辑一致,但可读性稍弱,所以更推荐第一种方案。
内容的提问来源于stack exchange,提问作者Hemant Sisodia
相关产品推荐
相关产品推荐

