【问题标题】:Strange Oracle behavior: TO_DATE and CONCAT in WHERE clause奇怪的 Oracle 行为:WHERE 子句中的 TO_DATE 和 CONCAT
【发布时间】:2011-07-07 17:36:27
【问题描述】:

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

【问题讨论】:

    标签: sql oracle date oracle10g ora-01858


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 太棒了!搜索了日、月和年值的所有唯一值。找到 4 行具有 NULL 值。查询现已全面运行!
    猜你喜欢
    • 2016-02-04
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多