select to_number(replace(nvl('-100,000',0),'',','),'999,999,999.99')from dual;
...产生输出:100000
现在我在表列的过程中使用相同的表达式:
select to_number(replace(nvl(TABLEA.VOLUME,0),'',','),'999,999,999.99')from TABLEA;
...并获得输出:无效数字
VOLUME
中的列TABLEA
的类型为VARCHAR2
。
答案 0 :(得分:1)
最肯定的是,列VOLUME
的内容存储为没有分组字符(,
)的字符串。因此,这些字符串违反了to_number
转换中的格式。
此外,REPLACE
中的参数顺序没有意义。
最后,您希望将呼叫交换到NVL
和REPLACE
。
因此-假设您要解析以字符串形式给出的2个小数位的数字,请使用以下内容:
select to_number ( nvl ( replace (TABLEA.VOLUME, ',', ''), 0), '999999999.99') from TABLEA;
答案 1 :(得分:0)
似乎您要将字符串值转换为money格式。
首先,考虑以替换方式进行操作,方法是按照参数顺序切换''
和','
参数以删除逗号,并使其适合于数字转换:
to_number(replace(nvl(str,0),',',''))
,
,然后将货币格式应用为:
with tableA as
(
select '-100,000' as volume
from dual
)
select to_char(
to_number(replace(nvl(volume,0),',',''))
,'fm999G999G990D00','NLS_NUMERIC_CHARACTERS = ''.,''')
as Money
from tableA;
MONEY
-----------
-100,000.00
根据货币显示样式,可以将点和逗号的顺序切换为
'NLS_NUMERIC_CHARACTERS = '',.'''
,将钱显示为-100.000,00
。
P.S。首先,您需要确保volume
列的所有数据都可以转换为数字才能使用to_number()
转换。