Sql 页面项的布尔值计算不正确

Sql 页面项的布尔值计算不正确,sql,oracle,oracle-apex,boolean-logic,Sql,Oracle,Oracle Apex,Boolean Logic,我在APEX页面中有一个报告,它有多个列,结果(行数)在10000到1000000(1M)条记录之间 我有一个条件where子句,它使用页面项的值来确定或限制显示的结果。。。它看起来像这样: SELECT ... FROM ... WHERE ... AND (:P2_STARTDATE IS NULL OR TO_DATE(:P2_STARTDATE, 'DD-MON-YYYY HH24:MI:SS') < creation_date) 它立即计算为NULL,并在大约1秒内返回相同

我在APEX页面中有一个报告,它有多个列,结果(行数)在10000到1000000(1M)条记录之间

我有一个条件where子句,它使用页面项的值来确定或限制显示的结果。。。它看起来像这样:

SELECT
  ...
FROM ...
WHERE ...
AND (:P2_STARTDATE IS NULL OR TO_DATE(:P2_STARTDATE, 'DD-MON-YYYY HH24:MI:SS') < creation_date)
它立即计算为NULL,并在大约1秒内返回相同的结果集0.5M+。。。现在,如果我设置了一个值,那么结果集显然是空的


所以问题是,如何让Oracle APEX快速计算以实现该表达式?感谢您提供的任何提示、解决方法或解决方案。

我不相信您的查询的第二部分是可以接受的-它不能使用索引。另外,您的示例与搜索实际结果集无关

一种方法是(在这个查询之外)将绑定变量转换为正确的数据类型,以便查询能够在创建日期使用索引(在创建日期有一个索引,对吗?)


在任何情况下,都要将函数从中删除并传入一个常量。

我不确定假设SQL引擎在您的OR上使用短路求值是否安全

试试这个:

AND (:P2_STARTDATE IS NULL 
     OR 
      (:P2_STARTDATE IS NOT NULL 
       AND TO_DATE(:P2_STARTDATE, 'DD-MON-YYYY HH24:MI:SS') < creation_date)
    )
和(:P2_STARTDATE为空
或
(:P2_STARTDATE不为空
截止日期(:P2开始日期,'DD-MON-YYYY HH24:MI:SS')<创建日期)
)

您是否检查了会话状态信息以确保P2\u STARTDATE确实为空?调试日志怎么样?您是否尝试从sqlplus运行相同的查询以查看是否也需要很长时间?嘿@eaolson,当检查会话的P2_STARTDATE值时,它只是空的,并且其状态是更新的或重置为空的…只是一种预感:您是否使用
启用部分页面刷新
=
?如果是这样,您是否将P2_STARTDATE包含在要提交的
页面项中?Jim,我的问题不一定与索引的可用性或有用性有关,而是与WHERE子句的正确/未经验证的评估以及页面项所检查的值有关。是的,在创建日期字段上有一个索引…:)我遇到的问题是,引擎似乎在根据页面项的值计算creation_date字段,即使该字段为NULL,并且在根据NULL或not进行计算时应该返回TRUE。
SELECT
  ...
FROM ...
WHERE ...
AND :P2_STARTDATE IS NULL OR creation_date > :newdatevariable;
AND (:P2_STARTDATE IS NULL 
     OR 
      (:P2_STARTDATE IS NOT NULL 
       AND TO_DATE(:P2_STARTDATE, 'DD-MON-YYYY HH24:MI:SS') < creation_date)
    )