4

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

但是选择中的这个语句评估得很好

to_date(
  concat(invoice_year,
  concat('-',
  concat(invoice_month,
  concat('-',invoice_day)))),'YYYY-MM-DD') as invoice_date
4

1 回答 1

7

在计算 TO_DATE 表达式时,表中可能存在会导致错误的行;但不满足 WHERE 子句中的其他条件。

当您将表达式放在 SELECT 列表中时,直到一行通过 WHERE 子句中的所有条件后才会计算它。

当您在条件中使用表达式时,可能会在其他条件之前对其进行评估,因此现在可能会针对导致错误的行对其进行评估。

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

于 2011-03-03T02:24:52.253 回答