Заменить (перевести) один символ на несколько - PullRequest
0 голосов
/ 14 мая 2009

У меня есть строка. В этой строке мне нужно заменить все специальные символы (0-31 код) выбранным представлением. Представления могут быть разных форматов. Может быть \ x ??, или \ 0 ???, или 10,13 -> \ n, 9 -> \ t и все остальные символы преобразуются в ноль Резюме - мне нужно найти все символы с кодами 0-31 и заменить их все для соответствующего представления, которое может быть ноль или более символов.

Решение должно работать в Oracle 9.2 (это означает, что нет регулярных выражений) и должно быть очень быстрым.

Я знаю, что функция TRANSLATE действительно быстрая. Но я не могу заменить один символ для многих. Я могу заменить только один на один.

Моё варварское (и простое) решение - создать списки с 32 элементами для каждого представления. Чем для выбранного представления сделать цикл по списку. Внутри цикла вызывается функция REPLACE. В этом случае я бы всегда звонил 32 раза. Я думаю, что это дорого.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 29 мая 2009

Это мой "варвар", но эффективное решение. это основная часть:

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 голос
/ 03 июня 2009

Это, вероятно, будет работать так же хорошо, и будет легче читать и поддерживать:

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;
1 голос
/ 14 мая 2009

Вы можете использовать декодирование. Документацию можно найти здесь:

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

Если вы используете его в процедуре или функции pl / sql, вы можете использовать его следующим образом:

SELECT decode(your_string, 'var1', 'repl1', 'var2', 'repl2', 'varN', 'replN')
INTO l_decoded_string
FROM dual;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...