更换NVL

时间:2019-07-18 08:15:17

标签: sql oracle replace numbers 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;

...并获得输出:无效数字

VOLUME中的列TABLEA的类型为VARCHAR2

2 个答案:

答案 0 :(得分:1)

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

此外,REPLACE中的参数顺序没有意义。

最后,您希望将呼叫交换到NVLREPLACE

因此-假设您要解析以字符串形式给出的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()转换。

Demo