2014-10-16 2 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 (으로 myText 교체 ' 알파벳 ','ABC ')'? –

답변

2

을 얻을 수 없습니다 일치가없는 경우 REPLACE 그대로 값을 떠날 것 같은

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

작동합니다. 그러나 이는 테이블의 모두 행을 터치하여 일부 값만 대체합니다. 최소한 그다지 효율적이지는 않습니다. 또한 문자열 시작 부분이 아닐지라도 세계의 모든 문자를 Alphabet으로 바꿉니다. 당신은 참으로 CASE을 사용할 수,

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

문제가 여러 대체 문자열을 지원하기 위해 편집 한 것처럼 http://sqlfiddle.com/#!4/16512/1


를 참조하십시오 : 당신은 더 강력한 뭔가를해야 할 경우

, 당신은 필터를 추가한다 성명 :

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 절을 사용하는 두 번째 옵션이 내 기본 설정입니다. –

+0

@ 패트릭. 나는 너에게 동의한다. 예를 들어 테스트 테이블의 빠른 업데이트를위한 첫 번째 솔루션을 예약 할 것입니다. 그러나 프로덕션 코드의 경우 두 번째 형식 만 사용합니다. –

+0

감사합니다 ... 왜 내가 성명서를 사용하고 싶었는지 확실하지 않았습니다. 도움을 받아 필자는 시도하고있는 작업을 반영하기 위해 내 게시물을 업데이트했습니다. 처음에 들었던 것보다 많은 mytext 값이 있습니다. 답장을 보내 주셔서 감사합니다. – mfrancis

0

당신은 첫번째 N을 확인하기 위해 CASE 문에서 SUBSTR 기능을 사용할 수 있습니다보기 문자.

당신은 문자의 수를 비교되는 조정해야 할 수도 있습니다 :이 예에서는 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 
    ) ;