PostgreSQL TSTZRANGE查询含空范围结果问题求助
解决PostgreSQL范围查询混入空范围的问题
嘿,这个问题我之前也碰到过!PostgreSQL里的空范围确实会在使用&&重叠操作符时搞点小麻烦——它会被判定为和任何范围都重叠,这就是你查询结果里混进空范围记录的原因。既然没法修改数据,那咱们直接在查询里把这些空范围过滤掉就行,给你两个靠谱的方法:
方法一:用empty()函数直接过滤空范围
PostgreSQL自带了empty()函数,专门用来判断一个范围是否为空。把这个条件加到WHERE子句里,就能轻松排除空范围的记录:
SELECT id, lifespan FROM companyfeatures WHERE lifespan && TSTZRANGE('1 Mar 2020', '1 May 2020') AND NOT empty(lifespan);
这个方法最通用,不管你的空范围是边界全为NULL还是边界交叉导致的(比如起始日期晚于结束日期的范围),都能准确过滤掉。
方法二:检查范围边界(可选)
如果你的空范围都是那种上下边界全为NULL的情况(也就是你提到的DateTimeTZRange(None, None, '()')),也可以通过检查边界是否非空来过滤:
SELECT id, lifespan FROM companyfeatures WHERE lifespan && TSTZRANGE('1 Mar 2020', '1 May 2020') AND lower(lifespan) IS NOT NULL AND upper(lifespan) IS NOT NULL;
不过要注意,这个方法有局限性——如果是空范围是因为边界交叉导致的(比如TSTZRANGE('1 May 2020', '1 Mar 2020')),它的边界非空但依然是空范围,这种情况就没法被过滤掉,所以优先推荐第一种方法。
补充说明
为啥空范围会被&&匹配上?这是PostgreSQL对范围重叠操作的定义决定的:空范围会被认为和所有范围都存在重叠,所以必须手动显式排除它们,才能拿到你真正想要的、和指定日期范围有实际重叠的记录。
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

