SQL WHERE语句如何筛选billed_date早于date_submitted且保留后者为null的行
解决方案
不需要子查询,直接调整WHERE子句即可实现需求。你丢失空值行的核心原因是:NULL和任意日期做大小比较的结果都为UNKNOWN,无法被条件匹配,因此需要单独声明date_submitted为空的保留规则。
调整后的完整查询
SELECT dd.file_acceptance, billing.billed_date, indiv_responses.date_submitted FROM ds LEFT OUTER JOIN dd ON ds.dd_id = dd.id LEFT OUTER JOIN billing ON ds.billing_id = billing.id LEFT OUTER JOIN indiv_responses ON indiv_responses.ds_id = ds.id WHERE -- 第一层:满足初始日期门槛,可按需替换为你需要的2021-10-20或2021-10-25 (billing.billed_date >= '2021-10-20' OR indiv_responses.date_submitted >= '2021-10-20') -- 第二层:保留空提交日期,或账单日期早于提交日期的行 AND (indiv_responses.date_submitted IS NULL OR billing.billed_date < indiv_responses.date_submitted)
兼容不同SQL方言的可选写法
如果你使用的数据库支持COALESCE函数(MySQL、PostgreSQL、SQL Server等主流数据库均支持),也可以合并写法,效果完全一致:
WHERE (billing.billed_date >= '2021-10-20' OR indiv_responses.date_submitted >= '2021-10-20') AND billing.billed_date < COALESCE(indiv_responses.date_submitted, '9999-12-31')
这里的逻辑是把空的提交日期替换为一个极大的日期(9999-12-31),所有正常的账单日期都会小于这个值,就能自动保留空提交日期的行。
内容的提问来源于stack exchange,提问作者kyuzon
相关产品推荐
相关产品推荐

