2011-03-25 125 views
2

我正在研究一個涉及評估車輛修改的應用程序,並從存儲在Oracle 10g數據庫中的數據中進行一些編號處理。不幸的是,我只有數據庫中的文本數據,但我需要使用數字而不是文本。我想知道是否有人可以幫助我理解如何使用PLSQL在Oracle 10g數據庫中對VARCHAR2列數據執行字符串操作:PLSQL修改VARCHAR2列數據

例如:我需要在名爲CARS的表中取一個名爲TOP_SPEED的VARCHAR2列,解析其列中的文本數據以將其分解爲兩個新值,並將這些新值插入到CARS表中的兩個新的NUMBER類型列中,即TOP_SPEED_KMH和TOP_SPEED_MPH。

TOP_SPEED列中的數據是這樣的:例如。 「153 km/h(94.62 mph)」

我想將值153.00保存到TOP_SPEED_KMH列,並將94.62值保存到TOP_SPEED_MPH列中。

我想我有一個查詢/腳本做的是這樣的:

  1. 選擇TOP_SPEED文本數據到本地文本變量
  2. 修改本地文本變量並保存新的值代入二號變量
  3. 寫回兩個數字變量對應TOP_SPEED_KMH和TOP_SPEED_MPH列

可能有人請確認我在正確的軌道上?如果有人有時間,我也會非常感謝任何示例代碼。

乾杯

回答

1

我認爲只需要有top_speed_kmh列,擺脫mph就更好了。由於一英里公里內的千米數不會改變,因此您可以乘以0.6來轉換爲英里。因此,您可以執行與N West建議的相同的更新語句,而不使用mph列: UPDATE CARS SET TOP_SPEED_KMH = TO_NUMBER(SUBSTR(1,(INSTR(UPPER(TOP_SPEED),「KM/H」)-1)));

每當你需要英里/小時的速度,只要做 從汽車選擇top_speed_kmh * 0.6作爲top_speed_mph;

+0

這很好。端部的解決方案是: 'UPDATE CARS SET CAR_TOP_SPEED_KPH = TO_NUMBER(SUBSTR(CAR_TOP_SPEED,1,INSTR(UPPER(CAR_TOP_SPEED) KM/H')-1)), CAR_TOP_SPEED_MPH = TO_NUMBER(SUBSTR(REGEXP_SUBSTR( CAR_TOP_SPEED,'\([0-9] +'),2));' – fuzzyanalysis 2011-04-10 03:21:33

1

對於分析一下,你可能會使用兩種REGEXP_SUBSTR或INSTR與SUBSTR

然後使用TO_NUMBER轉換爲數字

您可以創建每個PL/SQL函數解析,返回數字值,並在字段上運行UPDATE查詢,或者可以創建一個PL/SQL過程,其中的遊標循環遍歷所有要更新的數據。

下面是一些內建的索姆鏈接:

http://psoug.org/reference/substr_instr.html http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/functions116.htm

+0

乾杯。每當我嘗試使用遊標來處理這類東西時,我都會收到錯誤,所以簡單的'UPDATE ...'和'SET'現在可以工作......也許有更多經驗我會考慮循環:)。 – fuzzyanalysis 2011-04-10 03:32:48

+0

似乎是一個不錯的選擇,如果你可以用UPDATE/SET來解決它就夠了!如果你需要做更復雜的事情,在UPDATE/SET中難以做到,則使用遊標循環是你通常採用的方法。而且,當使用遊標和循環做東西時,您正在創建的代碼可能比純粹的UPDATE語句更依賴於數據庫。 – Brummo 2011-04-10 20:11:10

1

你可能甚至不需要用PL/SQL來完成這件事。

只要在列中的數據是一致的「99.99公里每小時(99.99米/小時)」,你可以直接用SQL做到這一點:

UPDATE CARS 
SET TOP_SPEED_KMH = TO_NUMBER(SUBSTR(1, (INSTR(UPPER(TOP_SPEED), "KM/H") - 1))), 
    TOP_SPEED_MPH = <similar substr/instr combination to pull the 99.99 mph out of code>; 

集合的操作通常比過程要快得多操作。

+0

謝謝,這是正確的答案(請參閱我對布萊恩芬頓的回覆) – fuzzyanalysis 2011-04-10 03:30:24

1

我的工作,涉及到 車輛方面 評估修改一個應用程序,並做了一些數 運算從存儲在 Oracle 10g數據庫的數字。不幸的是,我 只有一個文本數據庫中的數據,但 我需要用數字和 工作不是文本

聽起來像是你應該有一些數列來存儲這些解析出的值。而不是總是調用一些解析例程(無論是regexp還是substr或自定義函數),請傳遞表中的所有數據並填充新的數字字段。您還應修改ETL過程以填充前進的新數字字段。

如果你需要數字並且可以解析它們,那麼做一次(希望在一個臨時區域或至少幾個小時),然後得到你想要的數字。現在,你可以自由地做算術和一切你想從實數期望;)

+0

是的,這就是我在原始問題中的含義,不是每次都解析:)。 – fuzzyanalysis 2011-04-10 03:28:47

1

with s as 
    (select '153 km/h (94.62 mph)' ts from dual) 
select 
    ts, 
    to_number(substr(ts, 1, instr(ts, ' ') -1)) speed_km, 
    to_number(substr(regexp_substr(ts, '\([0-9]+'), 2)) speed_mph 
from s 
 
+0

謝謝,這幫助我解決了如何提取MPH部分的速度。 – fuzzyanalysis 2011-04-10 03:20:47

0

謝謝大家,真的很高興能夠利用每個人的投入,得到如下答案:

UPDATE CARS 
    SET 
    CAR_TOP_SPEED_KPH = 
     to_number(substr(CAR_TOP_SPEED, 1, instr(UPPER(CAR_TOP_SPEED), ' KM/H') -1)), 
    CAR_TOP_SPEED_MPH = 
     to_number(substr(regexp_substr(CAR_TOP_SPEED, '\([0-9]+'), 2));