2013-06-18 74 views
0

我在一個表中有近2000行(「傳感器」,它有2000多行),我需要更新一列,傳感器名稱。使用regexp_replace的Oracle sql更新

更新內的替換部分基於另一個表deviceport的內容。

Deviceport通過此deviceportid列與sensor更新表相關 - sensor.deviceportid = deviceportid。因此,每一行的實際更新都不相同。我不想寫2000更新語句,但我一直無法弄清楚我的「where」語句會說什麼。

UPDATE sensor sn SET sn.sensorname = ( 
    SELECT REGEXP_REPLACE(
     sensorname, 
     '^P(\d)', 
     'J ' || (
       SELECT d.deviceportlabel 
       FROM deviceport d 
       WHERE d.deviceportid = s.deviceportid 
       ) || 
     ' Breaker \1' 
    ) 
    FROM sensor s 
    WHERE REGEXP_LIKE(sensorname, '^P(\d)') 
) 
WHERE ...? 

任何線索?

回答

1
UPDATE sensor sn 
SET sn.sensorname = 'J ' || 
    (
    SELECT d.deviceportlabel 
    FROM deviceport d 
    WHERE d.deviceportid = sn.deviceportid 
    ) || ' Breaker ' || substr(sn.sensorname, 2, 1) 
WHERE REGEXP_LIKE(sn.sensorname, '^P\d') 
+2

請簡要** **解釋你的代碼。 –

+1

@StéphaneBruckert - 我的代碼非常類似於OP的代碼。你究竟是不明白的? –

+0

forhead * smack * - 當然!謝謝! – GLaDOS

1

試試這個: -

UPDATE sensor sn, deviceport d 
SET sn.sensorname = REGEXP_REPLACE(
     sn.sensorname,'^P(\d)', 'J '|| d.deviceportlabel||' Breaker \1') 
WHERE d.deviceportid = sn.deviceportid 
AND REGEXP_LIKE(sn.sensorname, '^P(\d)');