我对桌子上的列有一个小问题。 该列是一个名为“prize”的 Varchar。 数据类似于:
00008599
00004565
00001600
etc...
他们必须成为:
85.99
45.65
16.00
etc...
我尝试过使用 to_number 函数,但它不起作用。 比如:
SELECT to_number(prize, '999999.99') FROM TABLE
错误是:ORA-01722
您可以使用 LTRIM 去掉前导零并除以 100:
SELECT to_number(ltrim(prize, '0')) / 100 FROM table
请注意,您自己必须处理字符串放大 100 倍的事实。最简单的方法应该是这样的:
SELECT to_number(prize)/100 FROM TABLE
虽然其他两个答案给出了解决方案,但它们并没有解释导致问题的原因。
问题的一部分是Oracle文档和Oracle错误消息都不清楚。 只有字符串(或数字的“显示”)具有格式。 在 Oracle TO_NUMBER 函数中,第二个“格式”参数告诉 Oracle 如何“解释”第一个参数,而不是如何显示结果。 Oracle 文档没有明确说明这一点。 不幸的是,Oracle 文档使用同一页面来描述 TO_NUMBER 和 TO_CHAR 函数的格式代码。 更糟糕的是,格式代码页是从TO_CHAR函数的角度来写的;也就是说,它表示“0”将显示前导零。 这对于 TO_NUMBER 函数来说是错误的。
更复杂的是,ORA-01722“无效数字”错误消息不是很清楚。这表示作为第一个参数提供的字符串对于第二个参数中的格式代码而言无效。 为什么无效? 因为格式代码包含小数点,而第一个参数不包含小数点。 所以Oracle无法根据第二个参数中给出的“规则”解释第一个参数。 您可以通过运行不带可选第二个参数的 TO_NUMBER 函数来确认这一点...
SELECT TO_NUMBER('00001600') FROM DUAL;
...忠实地报告了
。 Oracle 可能使用某种 默认格式字符串,但我在 Oracle
TO_NUMBER或Format Model
文档中没有看到任何明确的内容。
虽然页面上的其他答案有效,但从一开始就正确使用 TO_NUMBER 函数也可以。
首先,使用 TO_NUMBER 函数将第一个参数中的 VARCHAR 转换为纯数字,请记住纯数字没有固有格式。格式仅在显示时设置:
SELECT TO_NUMBER('00001600', '99999999') FROM DUAL;
解释
第一个数字;也就是说,将每个字符解释为数字。其次,将数字除以 100 以获得所需的幅度。 (我正在展示上面相同查询的“渐进增强”):
SELECT TO_NUMBER('00001600', '99999999')/100 FROM DUAL;
最后,现在您已经有了所需大小的纯数字,您可以告诉 Oracle 如何使用 TO_CHAR 函数显示它:
SELECT TO_CHAR(TO_NUMBER('00001600', '99999999')/100, '9999.99') FROM DUAL;
为什么
原始问题中的查询没有给出预期的结果。