0

我正在使用 Oracle 10g,并且有一个数据库列 Q1 的数据类型为 varchar2。此列主要包含 float 和 int 值。

我正在尝试运行一个查询,该查询将获取值,但具有标准美国货币格式的值格式。例如,如果值为 3020,则查询将返回 3,020.00。

我尝试了以下方法,但都不起作用。

SELECT TO_CHAR(Q1, '9,999.99') FROM TABLE1;

ORA-01722: invalid number
01722. 00000 -  "invalid number"


SELECT TO_CHAR(TO_NUMBER(Q1), '9,999.99') FROM TABLE1;

ORA-01722: invalid number
01722. 00000 -  "invalid number"

我还尝试使用实际值而不是列名,第一个示例有效。:-/

SELECT TO_CHAR('1234', '9,999.99') FROM TABLE1;  //returns 1,234.00

在这一步之后,我返回并尝试在 TO_NUMBER() 中添加格式掩码: SELECT TO_CHAR(TO_NUMBER(Q1, '9,999.99'), '9,999.99') FROM TABLE1;

ORA-01722: invalid number
01722. 00000 -  "invalid number"

它仍然无法正常工作。

有人可以准确解释为什么这不适用于我的专栏吗?最初虽然是因为列的数据类型不是数字、浮点数或整数,但即使转换为数字后,我仍然会遇到同样的错误。任何帮助将不胜感激。

4

2 回答 2

2

您的 Q1 列是 VARCHAR2?然后你会想做这样的事情:

select to_char(to_number('3200'), '9,999.00') from dual

或使用您的表/列引用:

select to_char(to_number(Q1), '9,999.00') from table1;

您只需要希望此列仅包含数字而没有字母、特殊字符等,否则您将得到

ORA-01722: 无效号码

再次出错。

于 2013-08-27T20:56:41.300 回答
1

这很可能意味着您在Q1.

因此,要么过滤掉具有这些值的行,要么替换它们(例如用0.00

SELECT TO_CHAR(Q1, '9,999.99') 
  FROM table1
 WHERE REGEXP_LIKE(q1, '^[+-]?[.0-9]+$');

SELECT CASE WHEN REGEXP_LIKE(q1, '^[+-]?[.0-9]+$') 
            THEN TO_CHAR(Q1, '9,999.99') 
            ELSE '0.00'
       END q1
  FROM table1;

这是SQLFiddle演示

于 2013-08-27T20:59:27.150 回答