0
我試圖將VARCHAR類型列的記錄複製到同一個表中的FLOATE類型列。目前我正在使用一些正則表達式來實現此目的。而我正在使用的查詢是:如何測試列值是否在Oracle中爲數字
update ao_invoice_detail t1 set (t1.flex_field21, t1.flex_field22,flex_field23,flex_field24,flex_field25) = (
select
case when regexp_like(t2.flex_field1, '^-?[[:digit:],.]*$') then t2.flex_field1 end as field1,
case when regexp_like(t2.flex_field2, '^-?[[:digit:],.]*$') then t2.flex_field2 end as field2,
case when regexp_like(t2.flex_field4, '^-?[[:digit:],.]*$') then t2.flex_field4 end as field3,
case when regexp_like(t2.flex_field5, '^-?[[:digit:],.]*$') then t2.flex_field5 end as field4,
case when regexp_like(t2.flex_field8, '^-?[[:digit:],.]*$') then t2.flex_field8 end as field5
from
ao_invoice_detail t2
where
t1.id = t2.id
);
上述查詢的問題在於,如果相應的字段值爲非數字(覆蓋第2列的舊值),它正在更新null。但是,我的要求是IF THE COLUMN1值是數字則只有UPDATE COLUMN2要不然不會更新
任何一個可以請提出更好的辦法來做到這一點還是我們有任何預先定義的函數在SQL/oracle,這樣我可以測試列的數據是數字還是字母數字?
您的幫助:)
感謝Linoff的快速解決方案。但是,上面的查詢會更新總是..我的意思是,即使COLUMN1值是非數字,它會嘗試更新COLUMN2舊值..我不想要,因爲我要去執行此查詢數據庫龐大。我們是否可以使用一些我們可以用作標準的函數,以便避免不必要的數據庫命中。 – Manu 2014-09-18 19:34:33
@Manu。 。 。這是'where'子句的用處。但是,更新記錄中的一個或多個字段的工作大致相同。 – 2014-09-18 19:53:37