我使用的是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后仍然会得到相同的错误。任何帮助将不胜感激。
答案 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 演示