在我执行查询时,
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。
你能不能帮我写一些正确的查询,以便发生这个错误?
答案 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
错误的人:
当逻辑运算符(=,!=,>,<,<=,> =)的右侧包含多个值时,将出现此错误。
可能的解决方案:
IN
代替(=)和NOT IN
代替(!=)处理多个值ALL
,ANY
或SOME
作为documented处理多个值。