2014-10-16 96 views
1

mytext是包含值('ABC123','ABC456','Alphabet 123','Alphabet 456', 'DEF123' ...)mytable中的一列,但我希望將它們全部格式化爲'ABC123'。只需用我不能得到正確的語法在Oracle CASE語句中使用REPLACE

UPDATE mytable 
    SET mytext = 
    CASE 
     WHEN (mytext like 'Alphabet %') Then REPLACE(mytext, 'Alphabet ', 'ABC') 
     WHEN (mytext like 'Dookickey %') Then REPLACE(mytext, 'Doohickey ', 'DEF') 
     WHEN (mytext like 'Goofiness %') Then REPLACE(mytext, 'Goofiness ', 'GHI') 
     ELSE -- I want no other rows to be processed 
    END; 
+0

'UPDATE MYTABLE SET mytext的= REPLACE(mytext的,'字母','ABC')'? – 2014-10-16 21:44:54

回答

2

UPDATE mytable SET mytext = REPLACE(mytext, 'Alphabet ', 'ABC') 

將正常運行REPLACE會留下完整的值,如果沒有匹配。但是,這會觸動表格中的全部行,它們自己替換了一些值 - 這至少不是非常有效。此外,即使不在字符串的開頭,這也會取代世界上任何一個發生的事件。

如果你需要的東西更強大的,你應該添加過濾器:

UPDATE mytable SET mytext = REPLACE(mytext, 'Alphabet ', 'ABC') 
    WHERE mytext LIKE 'Alphabet %' 

http://sqlfiddle.com/#!4/16512/1


隨着問題被編輯,支持多種替換字符串,你確實可以使用CASE聲明:

UPDATE mytable 
    SET mytext = 
    CASE 
     WHEN (mytext LIKE 'Alphabet %') THEN REPLACE(mytext, 'Alphabet ', 'ABC') 
     WHEN (mytext LIKE 'Dookickey %') THEN REPLACE(mytext, 'Dookickey ', 'DEF') 
     WHEN (mytext LIKE 'Goofiness %') THEN REPLACE(mytext, 'Goofiness ', 'GHI') 
     ELSE mytext 
    --  ^^^^^^ 
    -- let unchanged 
    END; 

請參閱http://sqlfiddle.com/#!4/31531c/1

與我的第一個解決方案一樣,這將觸碰全部行的表格。和以前一樣,你可以使用過濾器來避免這種情況。在這種情況下,ELSE條款是不是不再需要(因爲不匹配的行則不):

UPDATE mytable 
    SET mytext = 
    CASE 
     WHEN (mytext LIKE 'Alphabet %') THEN REPLACE(mytext, 'Alphabet ', 'ABC') 
     WHEN (mytext LIKE 'Dookickey %') THEN REPLACE(mytext, 'Dookickey ', 'DEF') 
     WHEN (mytext LIKE 'Goofiness %') THEN REPLACE(mytext, 'Goofiness ', 'GHI') 
    END 
    WHERE mytext LIKE 'Alphabet %' 
    OR mytext LIKE 'Dookickey %' 
    OR mytext LIKE 'Goofiness %'; 

http://sqlfiddle.com/#!4/44846/1

+1

你的第二個選項與where子句是我的偏好。 – 2014-10-16 21:53:29

+0

@帕特里克我同意你的意見。例如,我會保留用於快速更新測試表的第一個解決方案。但對於生產代碼,我只能使用第二種形式。 – 2014-10-16 21:57:03

+0

謝謝......我不清楚爲什麼我想使用一個case語句。在幫助下,我更新了我的帖子,以反映我正在嘗試的操作... mytext中有更多的值比我最初讓步的更多。感謝您的回覆。 – mfrancis 2014-10-16 21:59:38

0

您可以使用SUBSTR函數的CASE語句來檢查前N字符。

您可能需要調整被比較的字符數:在這個例子中,CASE僅匹配到前8個字符:

select CASE SUBSTR("FIELD1", 1, 8) 
      -- 12345678 
      WHEN 'OLD_TEXT' THEN REPLACE("FIELD1", 'OLD_TEXT', 'NEW_TEXT') 
      WHEN 'ALPHABET' THEN REPLACE("FIELD1", 'ALPHABET', 'ABC') 
      ELSE "FIELD1" -- For all other values, leave unchanged 
      END 
    from 
    ( 
     select 
     'OLD_TEXT1' "FIELD1" 
     FROM DUAL 
     UNION 
     select 
     'OLD_TEXT2' "FIELD1" 
     FROM DUAL 
     UNION 
     select 
     'ALPHABET' "FIELD1" 
     FROM DUAL 
     UNION 
     select 
     'DNR1' "FIELD1" 
     FROM DUAL 
     UNION 
     select 
     'DNR2_DO_NOT_REPLACE' "FIELD1" 
     FROM DUAL 
    ) ;