我在表中有一组记录,其中一些记录的日期无效。我想忽略这些无效记录,并检查其余记录。我构建了如下查询,但发现它不起作用。
select * from tbl_name i
where is_date(i.dob) and i.dob::date > CURRENT_DATE;
我知道sql不会短路,所以它也会考虑无效的记录,并以超出范围的日期/时间结束。请帮助我以一种可以消除无效日期并仅对有效日期进行日期比较的方式修改此查询。
我在表中有一组记录,其中一些记录的日期无效。我想忽略这些无效记录,并检查其余记录。我构建了如下查询,但发现它不起作用。
select * from tbl_name i
where is_date(i.dob) and i.dob::date > CURRENT_DATE;
我知道sql不会短路,所以它也会考虑无效的记录,并以超出范围的日期/时间结束。请帮助我以一种可以消除无效日期并仅对有效日期进行日期比较的方式修改此查询。
2条答案
按热度按时间3wabscal1#
在Postgres中不能保证短路。无论是在“普通”WHERE子句中,还是在使用派生表(
from (select ...) where ...
)时,都不能保证短路。强制在两个步骤中求值的一种方法是物化公用表表达式:materialized
关键字可防止优化程序将外部查询的条件推入CTE。显然,这是假设
is_date()
永远不会返回误报lmvvr0a82#
在
WHERE
中使用CASE来区分有效日期和无效日期,并运行>
比较以确定有效日期,否则返回FALSE
。