我有一个名为折扣的列varchar2。它包含十进制数字和整数。我想将其转换为数字类型。所以我使用了这个查询
update table_name set newdiscount=to_number(discount)
我收到“非有效号码”错误。这里新的折扣是类型编号。
我检查过是否有逗号,但它们不是。当然,有许多行包含小数点,这些行显示在查询测试的结果中以检查任何非数字值
SELECT discount FROM table_name WHERE REGEXP_LIKE(discount, '[^[:digit:]]');
如何将折扣值复制到类型为number的newdiscount列?
答案 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