SQL使用带null的BETWEEN区间查询时如何兜底到数据表字段上下界
解决方案
下面提供两种可直接落地的实现逻辑,兼容绝大多数主流数据库(MySQL、PostgreSQL、SQL Server等):
方案1:COALESCE+子查询实现,逻辑直观
直接通过COALESCE函数处理空值兜底,匹配你描述的「空值取字段最大/最小值」的需求:
SELECT * FROM mytable WHERE created_at BETWEEN COALESCE(A, (SELECT MIN(created_at) FROM mytable)) AND COALESCE(B, (SELECT MAX(created_at) FROM mytable));
逻辑说明:COALESCE会返回传入参数中的第一个非空值,变量A为空时就取全表created_at的最小值作为下限,变量B为空时就取全表created_at的最大值作为上限。
方案2:OR条件判断,性能更优
如果你的表数据量较大,更推荐用条件判断的写法,不需要额外扫描全表计算最大最小值,执行效率更高:
SELECT * FROM mytable WHERE (A IS NULL OR created_at >= A) AND (B IS NULL OR created_at <= B);
逻辑说明:当A为空时,左半段条件直接成立,不会限制查询下限,等效于从最小的created_at开始查;当B为空时,右半段条件直接成立,不会限制查询上限,等效于查到最大的created_at,最终效果和方案1完全一致。
内容的提问来源于stack exchange,提问作者PlayMa256
相关产品推荐
相关产品推荐

