奇怪的Oracle行为:WHERE子句中的TO_DATE和CONCAT

时间:2011-03-03 01:33:43

标签: sql oracle date oracle10g ora-01858

我有一个从发票表中提取的有点复杂的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

1 个答案:

答案 0 :(得分:7)

在评估TO_DATE表达式时,表中可能会有行导致错误;但是这不符合WHERE子句中的其他条件。

当您将表达式放在SELECT列表中时,直到某行已经通过了WHERE子句中的所有条件,才会对其进行求值。

在条件中使用表达式时,可以在其他条件之前对其进行求值,因此现在可以对其导致错误的行进行求值。

请注意,如果给定行的任何字段中都有NULL,则会导致错误。