查询将 3 个不同的数据列与参考值进行比较

Query to compare 3 different data columns with a reference value

我需要检查 table(在 Oracle 数据库中)是否包含在特定日期之后更新的条目。在这种情况下,"Updated" 表示 3 列(DateCreatedDateModifiedDateDeleted)中的任何一列的值都大于引用。 到目前为止我提出的查询是这个

select * from myTable
where DateCreated  > :reference_date
   or DateModified > :reference_date
   or DateDeleted  > :reference_date
;

这有效并给出了预期的结果,但这不是我想要的,因为我只想输入一次 :reference_date 的值。 关于如何编写更优雅的查询有什么想法吗?

假设您可以将其重写为:

select * from myTable
where greatest(DateCreated, DateModified, DateDeleted)  > :reference_date;

如果你绝对必须这样做,但我不会。恕我直言,您的原始查询比这个查询更容易理解,而且通过使用函数,您已经失去了使用索引的任何机会,如果索引存在的话(除非您有基于新子句的基于函数的索引)。

虽然您看起来不错并且只使用一个绑定变量,但如果出于某种原因您有位置绑定而不是命名绑定,那么您可以避免提供绑定值的需要多次使用内联视图或 CTE:

with cte as (select :reference_date as reference_date from dual)
select myTable.*
from cte
join myTable
on myTable.DateCreated  > cte.reference_date
   or myTable.DateModified > cte.reference_date
   or myTable.DateDeleted  > cte.reference_date
;

但我不会再一次认为它比你原来的更好,除非你有一个真正令人信服的理由并且在提供绑定值时遇到问题。无论如何,必须从调用程序中设置它三次可能算不上有说服力,例如,对我来说。我会在部署前检查它不会影响性能 - 我希望 Oracle 能够优化这样的东西,但执行计划可能很有趣。