ORA-01797:此运算符必须后跟ANY或ALL错误

时间:2017-08-30 08:08:29

标签: sql oracle

在我执行查询时,

select *
from file_log f
where F.DCP_SRCE_FILENM_FK in ('ABC','DEF') and
      F.TRANS_DT>=to_date('08/25/2017','mm/dd/yyyy') and
      F.TRANS_DT<=('08/30/2017','mm/dd/yyyy')

我收到以下错误:

  

ORA-01797:此运算符必须后跟ANY或ALL。

你能不能帮我写一些正确的查询,以便发生这个错误?

3 个答案:

答案 0 :(得分:2)

只需使用date关键字和ISO常量:

select *
from file_log f
where F.DCP_SRCE_FILENM_FK in ('ABC','DEF') and
      F.TRANS_DT >= date '2017-08-25' and
      F.TRANS_DT <= date '2017-08-30';

您收到错误,因为缺少第二个常量to_date()。但是你也可以使用适当的语法来表示日期常量。

答案 1 :(得分:2)

您遗失TO_DATE

select *
from file_log f
where F.DCP_SRCE_FILENM_FK in ('ABC','DEF') and
      F.TRANS_DT>=to_date('08/25/2017','mm/dd/yyyy') and
      F.TRANS_DT<=TO_DATE('08/30/2017','mm/dd/yyyy')     -- Missing on this line

为什么会抛出异常

SQL解析器无法识别您打算使用TO_DATE函数并假设最后一行尝试将F.TRANS_DT与一个(ANY)或两者({{1}进行比较})值ALL所以假设查询应该具有语法:

('08/30/2017','mm/dd/yyyy')

这是一个语法上有效的查询。但是,它不会执行,因为尝试解析select * from file_log f where F.DCP_SRCE_FILENM_FK in ('ABC','DEF') and F.TRANS_DT>=to_date('08/25/2017','mm/dd/yyyy') and F.TRANS_DT<= ANY ('08/30/2017','mm/dd/yyyy') 比较将导致尝试将右侧的字符串隐式转换为几乎肯定会以F.TRANS_DT <= 'mm/dd/yyyy'失败的日期。但是SQL解析器已经尽力建议缺少什么来使查询有效。

答案 2 :(得分:0)

对于那些最终搜索到ORA-01797错误的人:

当逻辑运算符(=,!=,>,<,<=,> =)的右侧包含多个值时,将出现此错误。

可能的解决方案:

  1. 确保逻辑运算符的右侧包含单个值。
  2. 使用IN代替(=)和NOT IN代替(!=)处理多个值
  3. 使用ALLANYSOME作为documented处理多个值。