在oracle中将字符串转换为格式化数字

时间:2013-08-27 20:43:03

标签: sql oracle oracle10g

我使用的是Oracle 10g,并且数据库列的数据类型为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"

它还没有用。

有人可以解释为什么这对我的专栏无效吗?最初虽然这是因为列的数据类型不是数字,浮点数或整数,但即使转换为数字I后仍然会得到相同的错误。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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:无效号码

再次出错。

答案 1 :(得分: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 演示