在尝试将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);
答案 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'
。没错。
我认为这被视为“功能”。