我有一个字符串。在此字符串中,我需要用所选的表示替换所有特殊字符(0-31代码)。表示可以是不同的格式。可能是\ x ??,或\ 0 ???,或10,13 - > \ n,9 - > \ t和所有其他字符都转换为null。总结 - 我需要找到所有带有0-31个代码的符号,并将它们全部替换为适当的表示,可以是零个或多个符号。
解决方案应该适用于9.2 Oracle(这意味着没有正则表达式),并且速度非常快。
我知道TRANSLATE功能非常快。但是,我不能替换许多人的一个符号。我只能逐一替换。
我的野蛮(简单)解决方案是为每个表示创建包含32个元素的列表。比选择的表示形式在列表上循环。在循环内部调用REPLACE函数。在这种情况下,我将总是称为替换32次。我觉得这很费劲。
你有什么想法吗?
答案 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;