REPLACE WITH NVL


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;

。并获取输出:无效号码

TABLEA 中的列 VOLUME 的类型为 VARCHAR2

最肯定的是,列VOLUME的内容存储为没有分组字符(,(的字符串。因此,字符串违反了转换中的格式 to_number .

此外,REPLACE中的参数顺序毫无意义。

最后,您希望将调用交换为 NVLREPLACE

因此 - 假设您要解析以字符串形式给出的 2 个小数数字的数字 - 使用以下方法:

select to_number ( nvl ( replace (TABLEA.VOLUME, ',', ''), 0), '999999999.99') from TABLEA;

似乎您想将字符串值转换为货币格式。

首先,考虑像在参数顺序中切换''','参数以删除逗号一样替换,并使数字转换适合:

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

附言:首先,您需要确保volume列的所有数据都可以转换为数字,以便能够使用to_number()转换。

演示

最新更新