這取決於您在舊欄中的數據類型。如果所有的格式一致,那麼你可能能夠做到:
update patientinsurance
set newvisits = to_number(visitsauthorized, '<format model>')
但它聽起來更可能是你有什麼不容易對付。 (將數據存儲爲錯誤數據類型的樂趣,我假設你正在糾正)。如果有流氓角色,那麼你可以用translate
來擺脫它們,但是你不得不懷疑數據的完整性和你最終的價值。
您可以這樣做來顯示所有無法轉換的值,這可能會讓您知道繼續進行的最佳方法 - 如果只有少數您可以在手動更正之前手動更正重新運行您的更新:
這是猜測,你有一個名爲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;
或查看您的主表中有哪些記錄有newvisits
仍然null
。分析你的數據可能應該是第一步。
如果你想去掉所有非數字字符和治療任何留作號碼,然後你可以改變合併的事:
...
update set target.newvisits = regexp_replace(source.visitsauthorized,
'[^[:digit:]]', null)
但你可能並不需要合併,你可以做:
update patientinsurance set newvisits = regexp_replace(visitsauthorized,
'[^[:digit:]]', null);
這將去掉任何團體或小數點分隔符爲好,這可能不是一個問題,尤其是在你插入一個數字(8)列。但是如果你願意的話,你可以保留這些,通過改變模式爲'[^[:digit:].,]'
......儘管這可能會給你帶來其他問題。
如果正則表達式太慢,你也可以用translate
做到這一點。
這意味着你的'VISITSAUTHORIZED'表中的值不是有效的數字。可能輸入組或(不正確)小數點分隔符,但可以是任何東西。你可以添加一個值的樣本,看看這是否可以用數字格式掩碼解決嗎? –