在Oracle CASE语句中使用REPLACE

在Oracle CASE语句中使用REPLACE,oracle,Oracle,mytext是mytable中的一列,包含值('ABC123'、'ABC456'、'Alphabet 123'、'Alphabet 456'、'DEF123'…),但我希望它们都被格式化为'ABC123'。我不能理解正确的语法 UPDATE mytable SET mytext = CASE WHEN (mytext like 'Alphabet %') Then REPLACE(mytext, 'Alphabet ', 'ABC') WHEN (m

mytext
mytable
中的一列,包含值
('ABC123'、'ABC456'、'Alphabet 123'、'Alphabet 456'、'DEF123'…)
,但我希望它们都被格式化为
'ABC123'
。我不能理解正确的语法

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;
简单地使用:

 UPDATE mytable SET mytext = REPLACE(mytext, 'Alphabet ', 'ABC')
如果不存在匹配项,则应按
替换操作
将保持值不变。但是,这将涉及表中的所有行,并自行替换某些值——这至少不是很有效。此外,这将替换世界
字母表
,即使不在字符串开头

如果您需要更健壮的东西,您应该添加一个过滤器:

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


由于问题被编辑为支持多个替换字符串,因此确实可以使用
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;

与我的第一个解决方案一样,这将涉及表中的所有行。和以前一样,您可以使用过滤器来避免这种情况。在这种情况下,不再需要
ELSE
子句(因为不匹配的行保持不变):


请参见

您可以在CASE语句中使用SUBSTR函数检查前N个字符

您可能需要调整要比较的字符数:在本例中,大小写最多只匹配前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
    )  ;

updatemytable SET mytext=REPLACE(mytext,'Alphabet,'ABC')
?您可以选择where子句作为第二个选项。@Patrick我同意您的意见。例如,我会保留第一个解决方案,以便快速更新测试表。但对于生产代码,我只会使用第二种形式。谢谢。。。我不清楚我为什么要使用案例陈述。在帮助下,我更新了我的帖子,以反映我正在尝试的操作。。。mytext中的值比我最初透露的要多得多。谢谢您的回复。@mfrancis检查我的更新。你非常接近解决方案!谢谢你,西尔文。。。我今晚可以睡觉:)
    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
    )  ;