如何将包含十进制数的varchar2列转换为数字

时间:2013-06-18 07:17:56

标签: sql database oracle oracle-sqldeveloper

我有一个名为折扣的列varchar2。它包含十进制数字和整数。我想将其转换为数字类型。所以我使用了这个查询

update table_name set newdiscount=to_number(discount)

我收到“非有效号码”错误。这里新的折扣是类型编号。

我检查过是否有逗号,但它们不是。当然,有许多行包含小数点,这些行显示在查询测试的结果中以检查任何非数字值

SELECT discount FROM table_name  WHERE REGEXP_LIKE(discount, '[^[:digit:]]');

如何将折扣值复制到类型为number的newdiscount列?

2 个答案:

答案 0 :(得分:1)

Oracle会话中的NLS_NUMERIC_CHARACTERS参数可能与小数点不同。

您可以这样测试:

select 
  substr(VALUE ,1,1) as decimal_separator,
  substr(VALUE ,2,1) as group_separator
from 
  nls_session_parameters 
where 
  parameter = 'NLS_NUMERIC_CHARACTERS'

您可以在更新表之前更改会话以激活正确的分隔符:

alter session set  NLS_NUMERIC_CHARACTERS = '.,' 

或每次将小数点替换为当前小数点分隔符:

update table_name 
set newdiscount = ( select to_number( replace(discount, '.', substr(value,1,1)) )
                    from nls_session_parameters 
                    where parameter = 'NLS_NUMERIC_CHARACTERS'                  
                  )

可以在this SQLFiddle中找到一些概念验证示例。

答案 1 :(得分:0)

您可以尝试仅将这些验证更新为数字,例如

update table_name
set new_discount = CASE WHEN regexp_like(discount, '^[+-]?([0-9]*\.?[0-9]+|[0-9]+\.?[0-9]*)([eE][+-]?[0-9]+)?$') THEN to_number(discount) ELSE -99999 END