【问题标题】:Different result for to_number in Order By clause in OracleOracle中Order By子句中to_number的不同结果
【发布时间】:2016-01-15 19:32:35
【问题描述】:

我有两个查询在尝试将CHAR 转换为NUMBER 时给出错误ORA-01722: invalid number

SELECT to_number('NYC TERM') FROM dual;

WITH
  x AS (SELECT 'NYC TERM' AS col FROM dual
          UNION
        SELECT '33' FROM dual)
SELECT *
  FROM X
 ORDER BY to_number(col);

如果我删除 UNION 中的第二个 SELECT 查询工作正常。为什么它的行为不同?

问题是,当我作为一个整体运行查询返回其他行时会出错,但当我只针对具有此类数据的特定记录运行时,它会正常运行。

 WITH
   x AS (SELECT 'NYC TERM' AS col FROM dual)
 SELECT * FROM X ORDER BY to_number(col);

【问题讨论】:

    标签: sql oracle type-conversion ora-01722


    【解决方案1】:

    评论有点长。

    我认为正在发生的事情是 Oracle 出于性能原因将 order by 短路。只有一行,根本不需要排序,所以即使是键也不会被评估。在这个荒谬的例子中可能更清楚地看到了这一点:

     WITH x AS (SELECT 'NYT TERM' AS col FROM DUAL)
     SELECT * FROM X ORDER BY length(col) / 0;
    

    这将返回一行一列,'NYT TERM'。没有错误。

    我想这被认为是一个“功能”。

    【讨论】:

    • 非常感谢您的回复。这真的很荒谬。很难解释为什么会这样。
    • @Raja 。 . .一点也不。只有一条记录,无需评估 order by 键的表达式。这是一种性能增益。 . .尽管在评估键和排序一条记录的公认小案例中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    相关资源
    最近更新 更多