Oracle10g 将数据从varchar2复制到同一表中的数字
我有两列,我需要将数据从column VISITSAUTHORIZED复制到NEWVISITS,当我使用下面的命令复制数据时,我收到一条错误消息“invalid number”。有人能纠正吗Oracle10g 将数据从varchar2复制到同一表中的数字,oracle10g,Oracle10g,我有两列,我需要将数据从column VISITSAUTHORIZED复制到NEWVISITS,当我使用下面的命令复制数据时,我收到一条错误消息“invalid number”。有人能纠正吗 VISITSAUTHORIZED VARCHAR2(10) NEWVISITS NUMBER(8) SQL> update patientinsurance set NEWVISITS=VISITSAUTHORIZED ; ERROR at line 1: ORA-0172
VISITSAUTHORIZED VARCHAR2(10)
NEWVISITS NUMBER(8)
SQL> update patientinsurance set NEWVISITS=VISITSAUTHORIZED ;
ERROR at line 1:
ORA-01722: invalid number
这取决于旧列中的数据类型。如果所有内容的格式一致,则您可以执行以下操作:
update patientinsurance
set newvisits = to_number(visitsauthorized, '<format model>')
这是在猜测您有一个名为ID
的唯一标识符字段,但很明显,您可以根据表的情况更改该字段
另一种方法是转换有效的数字并跳过其余数字,这可以通过错误记录表来完成:
exec dbms_errlog.create_error_log(dml_table_name => 'PATIENTINSURANCE');
merge into patientinsurance target
using (select id, visitsauthorized from patientinsurance) source
on (target.id = source.id)
when matched then
update set target.newvisits = source.visitsauthorized
log errors into err$_patientinsurance reject limit unlimited;
然后,您可以查询错误表以查看失败的内容:
select id, visitsauthorized, ora_err_number$
from err$_patientinsurance;
或者查看主表中的哪些记录有newvisions
仍然null
。不过,分析数据可能是第一步
如果要去掉所有非数字字符并将剩余的字符视为数字,则可以将合并更改为:
...
update set target.newvisits = regexp_replace(source.visitsauthorized,
'[^[:digit:]]', null)
但是,您可能不需要合并,只需执行以下操作:
update patientinsurance set newvisits = regexp_replace(visitsauthorized,
'[^[:digit:]]', null);
这也将去掉任何组或十进制分隔符,这可能不是问题,尤其是在插入数字(8)列时。但是如果您愿意,您可以通过将模式更改为'[^[:digit:][,]'
。。。尽管这可能会给你带来其他潜在的问题
如果正则表达式太慢,也可以使用
translate
执行此操作。这意味着visitAuthorized
表中的值不是有效的数字。可能是使用组分隔符或(不正确的)小数分隔符输入的,但可以是任何内容。您能否添加一个值示例,看看这是否可以通过数字格式掩码解决?更新patientinsurance set newvisits=to_number(VisitAuthorized,'VARCHAR2(10)')如果我这样使用,我会在第1行收到类似这样的错误:ORA-01481:无效的数字格式model@Kiran不,不,,这不是一个好主意;首先看数据。如果您有类似于say'1234'
的数据,则模型可能类似于'999999'
。完全取决于表中的内容。当我使用合并过程时,我只能复制数字,但我需要访问授权包含的所有信息,如(TE44700,KET99500)到新访问(TE44700,KET99500)但我只复制了700500个值,其余的值都得到了错误日志,所以我需要做什么next@Kiran-不能将字符放入数字列中。对于那些-44
和99
或其他什么,你希望在新访问中得到什么?实际上,我正在从授权访问备份到新访问,如果我们丢失了混合字符和数字的值,那么如何获取所有值。
update patientinsurance set newvisits = regexp_replace(visitsauthorized,
'[^[:digit:]]', null);