2014-09-18 48 views
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,這樣我可以測試列的數據是數字還是字母數字?

您的幫助:)

回答

0

千恩萬謝,我認爲你只需要else條款:

select 
case when regexp_like(t2.flex_field1, '^-?[[:digit:],.]*$') then t2.flex_field21 else t1.flex_field21 end as field1, 
case when regexp_like(t2.flex_field2, '^-?[[:digit:],.]*$') then t2.flex_field22 else t1.flex_field22 end as field2, 
case when regexp_like(t2.flex_field4, '^-?[[:digit:],.]*$') then t2.flex_field24 else t1.flex_field23 end as field3, 
case when regexp_like(t2.flex_field5, '^-?[[:digit:],.]*$') then t2.flex_field25 else t1.flex_field24 end as field4, 
case when regexp_like(t2.flex_field8, '^-?[[:digit:],.]*$') then t2.flex_field28 else t1.flex_field25 end as field5 

編輯:

你爲什麼用join這樣做呢?

update ao_invoice_detail 
    set flex_field21 = (case when regexp_like(flex_field1, '^-?[[:digit:],.]*$') then flex_field1 else flex_field21 end), 
     flex_field22 = (case when regexp_like(flex_field2, '^-?[[:digit:],.]*$') then flex_field2 else flex_field22 end), 
     flex_field23 = (case when regexp_like(flex_field4, '^-?[[:digit:],.]*$') then flex_field4 else flex_field23 end), 
     flex_field24 = (case when regexp_like(flex_field5, '^-?[[:digit:],.]*$') then flex_field5 else flex_field24 end), 
     flex_field25 = (case when regexp_like(flex_field8, '^-?[[:digit:],.]*$') then flex_field8 else flex_field25 end); 
+0

感謝Linoff的快速解決方案。但是,上面的查詢會更新總是..我的意思是,即使COLUMN1值是非數字,它會嘗試更新COLUMN2舊值..我不想要,因爲我要去執行此查詢數據庫龐大。我們是否可以使用一些我們可以用作標準的函數,以便避免不必要的數據庫命中。 – Manu 2014-09-18 19:34:33

+0

@Manu。 。 。這是'where'子句的用處。但是,更新記錄中的一個或多個字段的工作大致相同。 – 2014-09-18 19:53:37