【问题标题】:Converting string to formatted number in oracle在oracle中将字符串转换为格式化数字
【发布时间】:2013-08-27 20:43:02
【问题描述】:

我正在使用 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() 中添加格式掩码: 从表 1 中选择 TO_CHAR(TO_NUMBER(Q1, '9,999.99'), '9,999.99');

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

还是不行。

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

【问题讨论】:

    标签: sql oracle oracle10g


    【解决方案1】:

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

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

    或使用您的表/列引用:

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

    你只需要希望这个列只包含数字,没有字母、特殊字符等,否则你会得到 ​​p>

    ORA-01722: 无效号码

    又报错了。

    【讨论】:

      【解决方案2】:

      这很可能意味着您在 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演示

      【讨论】:

        猜你喜欢
        • 2019-01-08
        • 2020-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-10
        • 1970-01-01
        • 2019-06-08
        相关资源
        最近更新 更多