2009-05-14 5 views
0

문자열이 있습니다. 이 문자열에서 모든 특수 문자 (0-31 코드)를 선택한 표현으로 바꿔야합니다. 표현 형식이 다를 수 있습니다. \ x ?? 또는 \ 0 ???, 또는 10,13 -> \ n, 9 -> \ t 그리고 다른 모든 문자는 null로 변환됩니다. 요약 - 나는 0-31 코드를 가진 모든 기호를 찾고 적절한 표현을 위해 모든 것을 대체 할 필요가있다. 이것은 0 개 이상의 기호 일 수있다.한 문자를 여러 문자로 바꾸기 (번역)

솔루션은 9.2 Oracle에서 작동해야합니다 (즉, 정규 표현식이 없음). shuld는 매우 빠릅니다.

TRANSLATE 기능이 정말 빠릅니다. Buth 나는 하나의 심볼을 많은 것으로 대체 할 수 없다. 하나씩 교체 할 수 있습니다.

야만스럽고 쉬운 솔루션은 각 표현에 대해 32 개의 요소가있는 목록을 만드는 것입니다. 선택한 표현에 대한 것보다 목록에 루프가 생깁니다. 루프 호출 REPLACE 함수 내부. 이 경우에는 항상 32 번 대체를 호출합니다. 나는 그것이 expencive라고 생각한다.

혹시 궁금하십니까?

+0

당신의 "야만인 솔루션"을 게시하시기 바랍니다 - 그것은이 갈 수있는 방법 같은 소리 대본. 그런 다음 더 효율적으로 만들 수 있는지를 지적 할 수 있습니다. 결국 나는 REPLACE에 대한 모든 호출이 필요할 것이라고 생각하지만, 생각보다 비용이 적게 듭니다. –

+0

ok)) 여러 가지 방법을 시도해 보았을 때 중첩 된 REPLACE가 가장 효율적이라는 것을 알았습니다. 32 개 요소가 적어도 두 번 이상 작동하는 미리 정의 된 목록입니다. Oracle Forum의 ACE에 따르면 많은 프로젝트에서 중첩 된 대체물을 성공적으로 사용하고 있습니다. 아래의 솔루션을 참조하십시오 ... – drnk

답변

1

:하지만, 당신은 PL/SQL 프로 시저를 사용하거나 작동하는 경우

http://www.techonthenet.com/oracle/functions/decode.php

이처럼 사용할 수 효과적인 솔루션. 그것은 주요 부분 :

res := 
    REPLACE(
     REPLACE(
      REPLACE(
       REPLACE(
        REPLACE(
         REPLACE(
          REPLACE(
           REPLACE(
            REPLACE(
             REPLACE(
              REPLACE(
               REPLACE(
                REPLACE(
                 REPLACE(
                  REPLACE(
                   REPLACE(
                    REPLACE(
                     REPLACE(
                      REPLACE(
                       REPLACE(
                        REPLACE(
                         REPLACE(
                          REPLACE(
                           REPLACE(
                            REPLACE(
                             REPLACE(
                              REPLACE(
                               REPLACE(
                                REPLACE(
                                 REPLACE(
                                  REPLACE(
                                   REPLACE(
                                    p_txt, 
                                    CHR(0), 
                                    '\0x00' 
                                   ), 
                                   CHR(1), 
                                   '\0x01' 
                                  ), 
                                  CHR(2), 
                                  '\0x02' 
                                 ), 
                                 CHR(3), 
                                 '\0x03' 
                                ), 
                                CHR(4), 
                                '\0x04' 
                               ), 
                               CHR(5), 
                               '\0x05' 
                              ), 
                              CHR(6), 
                              '\0x06' 
                             ), 
                             CHR(7), 
                             '\0x07' 
                            ), 
                            CHR(8), 
                            '\0x08' 
                           ), 
                           CHR(9), 
                           '\0x09' 
                          ), 
                          CHR(10), 
                          '\0x0A' 
                         ), 
                         CHR(11), 
                         '\0x0B' 
                        ), 
                        CHR(12), 
                        '\0x0C' 
                       ), 
                       CHR(13), 
                       '\0x0D' 
                      ), 
                      CHR(14), 
                      '\0x0E' 
                     ), 
                     CHR(15), 
                     '\0x0F' 
                    ), 
                    CHR(16), 
                    '\0x10' 
                   ), 
                   CHR(17), 
                   '\0x11' 
                  ), 
                  CHR(18), 
                  '\0x12' 
                 ), 
                 CHR(19), 
                 '\0x13' 
                ), 
                CHR(20), 
                '\0x14' 
               ), 
               CHR(21), 
               '\0x15' 
              ), 
              CHR(22), 
              '\0x16' 
             ), 
             CHR(23), 
             '\0x17' 
            ), 
            CHR(24), 
            '\0x18' 
           ), 
           CHR(25), 
           '\0x19' 
          ), 
          CHR(26), 
          '\0x1A' 
         ), 
         CHR(27), 
         '\0x1B' 
        ), 
        CHR(28), 
        '\0x1C' 
       ), 
       CHR(29), 
       '\0x1D' 
      ), 
      CHR(30), 
      '\0x1E' 
     ), 
     CHR(31), 
     '\0x1F' 
    ); 
1

디코딩을 사용할 수 있습니다. 문서는 여기에서 찾을 수 있습니다 :

내 "야만인"의
SELECT decode(your_string, 'var1', 'repl1', 'var2', 'repl2', 'varN', 'replN') 
INTO l_decoded_string 
FROM dual; 
+0

내 영어가 좋지 않습니다. (입력 문자열은 길이가 다를 수 있으며 0-31 코드뿐만 아니라 모든 문자를 포함 할 수 있습니다. 코드는 <= 31 인 문자를 선택한 표현으로 대체해야합니다 .Decode는 짧은 대체 목록이있는 문자에 유용합니다 .개의 가능한 대체 문자가 있으면 디코드 문이 너무 커서 읽고 읽을 수 없습니다. – drnk

+0

좋습니다. 교체해야 할 모든 코드가 들어있는 테이블과 교체해야 할 점은 무엇입니까? – Erik

+0

테이블을 사용하면 적용 할 수 없습니다 DETERMINISTIC 힌트 : ( – drnk

1

이 아마 읽고 유지하기 위해 단지뿐만 아니라 수행하고 쉬울 것 :

function trans (p_in in varchar2) return varchar2 is 
    l_out varchar2(32767) := p_in; 
begin 
    if length(l_out) > 0 then 
     for i in 0..31 loop 
     l_out := REPLACE(l_out, CHR(i), '\0x' || to_char(i,'FM0X')); 
     end loop; 
    end if; 
    return l_out; 
end trans; 
관련 문제