如何在PostgreSQL的WHERE子句中实现带IF逻辑的条件查询
实现PostgreSQL WHERE子句中的条件逻辑
要满足你描述的筛选需求,我们可以把两个条件组合成一个清晰的WHERE子句,核心是用**逻辑与(AND)和逻辑或(OR)**来嵌套处理条件2的分支逻辑。
最终SQL查询语句
SELECT * FROM order_tbl WHERE date_col_1 >= CURRENT_DATE - INTERVAL '1 day' AND (date_col_1 <= CURRENT_DATE OR date_col_2 > CURRENT_DATE);
逻辑拆解
我们把需求拆成两部分来看:
- 基础筛选条件:
date_col_1 >= CURRENT_DATE - INTERVAL '1 day'- 这里用
CURRENT_DATE获取当前日期(对应你的测试值2018-01-23),减去1天得到2018-01-22,确保只保留date_col_1在这个日期及之后的记录。
- 这里用
- 分支条件处理:
(date_col_1 <= CURRENT_DATE OR date_col_2 > CURRENT_DATE)- 当
date_col_1 <= 当前日期时,不需要检查date_col_2,直接符合要求; - 当
date_col_1 > 当前日期时,必须满足date_col_2 > 当前日期才会被选中。
- 当
测试数据验证(当前日期2018-01-23)
我们逐个看测试数据的筛选结果:
- 记录1:date_col_1=2018-01-21 → 不满足基础条件,被排除
- 记录2:date_col_1=2018-01-22 ≥2018-01-22,且date_col_1≤2018-01-23 → 选中
- 记录3:date_col_1=2018-01-21 → 不满足基础条件,被排除
- 记录4:date_col_1=2018-01-23 ≥2018-01-22,且date_col_1≤2018-01-23 → 选中
- 记录5:date_col_1=2018-01-24 >2018-01-23,date_col_2=2018-01-24 >2018-01-23 → 选中
- 记录6:date_col_1=2018-01-21 → 不满足基础条件,被排除
- 记录7:date_col_1=2018-01-25 >2018-01-23,但date_col_2=2018-01-22 ≤2018-01-23 → 被排除
- 记录8:date_col_1=2018-01-26 >2018-01-23,date_col_2=2018-01-26 >2018-01-23 → 选中
最终会选中的记录是order_id为2、4、5、8的四条数据。
补充说明
如果你的当前日期是固定值(比如测试时的2018-01-23),也可以把CURRENT_DATE替换成具体日期字符串,比如:
SELECT * FROM order_tbl WHERE date_col_1 >= '2018-01-23'::DATE - INTERVAL '1 day' AND (date_col_1 <= '2018-01-23'::DATE OR date_col_2 > '2018-01-23'::DATE);
效果是一样的,适合测试场景。
内容的提问来源于stack exchange,提问作者Sathesh S
相关产品推荐
相关产品推荐

