将一个字符替换(翻译)为多个

时间:2009-05-14 11:34:24

标签: oracle plsql

我有一个字符串。在此字符串中,我需要用所选的表示替换所有特殊字符(0-31代码)。表示可以是不同的格式。可能是\ x ??,或\ 0 ???,或10,13 - > \ n,9 - > \ t和所有其他字符都转换为null。总结 - 我需要找到所有带有0-31个代码的符号,并将它们全部替换为适当的表示,可以是零个或多个符号。

解决方案应该适用于9.2 Oracle(这意味着没有正则表达式),并且速度非常快。

我知道TRANSLATE功能非常快。但是,我不能替换许多人的一个符号。我只能逐一替换。

我的野蛮(简单)解决方案是为每个表示创建包含32个元素的列表。比选择的表示形式在列表上循环。在循环内部调用REPLACE函数。在这种情况下,我将总是称为替换32次。我觉得这很费劲。

你有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可以使用解码。文档可以在这里找到:

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;

答案 1 :(得分:1)

这是我的“野蛮人”,但却是有效的解决方案。它的主要部分是:

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'
    );

答案 2 :(得分: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;