Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询以将3个不同的数据列与参考值进行比较_Sql_Oracle - Fatal编程技术网

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

Sql 查询以将3个不同的数据列与参考值进行比较,sql,oracle,Sql,Oracle,我需要检查表(在Oracle数据库中)是否包含在某个日期之后更新的条目。在这种情况下,“更新”是指3列(DateCreated,DateModified,DateDeleted)中的任何一列的值大于参考值。 到目前为止,我提出的问题是 select * from myTable where DateCreated > :reference_date or DateModified > :reference_date or DateDeleted > :refer

我需要检查表(在Oracle数据库中)是否包含在某个日期之后更新的条目。在这种情况下,“更新”是指3列(
DateCreated
DateModified
DateDeleted
)中的任何一列的值大于参考值。 到目前为止,我提出的问题是

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;

如果你一定要,但我不会。您的原始查询,IMHO,比这个查询更容易理解,另外,通过使用函数,您已经失去了使用索引的机会,如果索引存在的话(除非您有一个基于新子句的基于函数的索引)。

而您所拥有的看起来很好,并且只使用了一个bind变量,如果出于某种原因,您有位置绑定而不是命名绑定,则可以通过使用内联视图或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能够优化类似的内容,但执行计划可能会很有趣。

但这只是一次。您有一个名为reference_date的绑定变量,在查询中使用了三次。使用Oracle,如果您描述了输入(或类似内容),在这种情况下,您会得到count=1还是3?我同意;这是一个解决方案,但最好使用原始查询。和:当任何值为NULL时,最大值返回NULL。所以你必须把它和COALESCE结合起来,这使得它更复杂,可读性也更低。这一点很好!尽管我会在每个列周围使用NVL(它比coalesce短!)。ETA:事实上,要使nvl的默认值与条件匹配或不匹配(取决于要求),我无论如何都要将其与:reference_日期绑定(例如nvl(datecreated,:reference_date-1)),这将有点否定使用best的全部意义!您可以使用
magest(NVL(DateCreated,DATE'0001-01-01')、NVL(DateModified,DATE'0001-01-01')、NVL(DateDeleted,DATE'0001-01-01'))
甚至
magest(COALESCE(DateCreated,DateModified,DateDeleted)、COALESCE(DateDeleted,DateCreated,DateModified),COALESCE(DateModified,DateDeleted,DateCreated))
,这正是我要找的。我比较了执行计划,您的解决方案成本为5(而我的为4)。轻微的性能下降并没有问题,这将导致调用程序中的代码更加干净(实际上我必须使用位置参数)。