我有一个从发票表中提取的有点复杂的SQL查询。要查询的表使用三个数字字段来创建日期(一个用于日,月和年)。
此查询使用TO_DATE函数内的concat函数调用的组合。在查询的SELECT部分没有问题,但是当我在WHERE子句中使用相同的语句时,我得到一个“ORA-01858:找到一个非数字字符,其中一个数字是预期的”,指的是第一个在WHERE子句中使用TO_DATE内的concat。
那么,在where子句中使用concat和TO_DATE有什么不同呢?
例如,WHERE的以下部分导致非数字字符错误
to_date(
concat(invoice_year,
concat('-',
concat(invoice_month,
concat('-',invoice_day)))),'YYYY-MM-DD')
> add_months(sysdate,-6)
但是select中的这个语句评估得很好
to_date(
concat(invoice_year,
concat('-',
concat(invoice_month,
concat('-',invoice_day)))),'YYYY-MM-DD') as invoice_date
答案 0 :(得分:7)
在评估TO_DATE表达式时,表中可能会有行导致错误;但是这不符合WHERE子句中的其他条件。
当您将表达式放在SELECT列表中时,直到某行已经通过了WHERE子句中的所有条件,才会对其进行求值。
在条件中使用表达式时,可以在其他条件之前对其进行求值,因此现在可以对其导致错误的行进行求值。
请注意,如果给定行的任何字段中都有NULL,则会导致错误。