2014-10-16 87 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 
    ) ;