Oracle中Order By子句中to_number的结果不同

时间:2015-10-16 23:00:55

标签: sql oracle type-conversion ora-01722

在尝试将ORA-01722: invalid number转换为CHAR时,我有两个查询错误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);

如果删除SELECT查询中的第二个UNION,则查询工作正常。为什么表现不同?

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

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

1 个答案:

答案 0 :(得分:3)

评论时间有点长。

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

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

这将返回一行'NYT TERM'。没错。

我认为这被视为“功能”。

相关问题