小数分隔符oracle

时间:2016-08-03 09:22:32

标签: sql oracle decimal

我需要用点替换逗号然后我需要我的值为数字。 所以我写了这个:

select replace('12345,6789', ',' , '.') from dual --it works fine

但是我想转换to_number那个值,我得到错误:

  

"invalid number"

2 个答案:

答案 0 :(得分:6)

to_number() function使用会话的NLS_NUMERIC_CHARACTERS设置来决定如何解释逗号和句点。如果您知道您的字符串将始终使用逗号作为小数分隔符,则可以使用可选的第三个参数覆盖该字符串作为调用的一部分;虽然这确实意味着您必须指定格式模型:

select to_number('12345,6789', '9999999999D9999', 'NLS_NUMERIC_CHARACTERS='',.''')
from dual;

TO_NUMBER('12345,6789','9999999999D9999
---------------------------------------
                             12345.6789

您不需要单独的replace()步骤。

您还可以使用ALTER SESSION SET NLS_NUMERIC_CHARACTERS=',.';更改会话的设置,但您可能无法控制每个必须运行代码的客户端中的设置。

答案 1 :(得分:1)

小数分隔符在您的语言环境中定义。这看起来像是,。因此,在转换字符串之前,您无需进行替换:

select to_number('12345.6789') from dual --should work already

或者更改您的语言区域:

alter session  set NLS_NUMERIC_CHARACTERS= '.,';
select to_number('123'||'.'||'456') from dual;
select to_number(replace('12345,6789', ',' , '.')) from dual