【发布时间】:2011-02-24 09:08:17
【问题描述】:
是否有从给定位置删除字符的方法?
假设我的话是: 薄煎饼 我想删除第二个字母(在这种情况下,'A'),所以我想要 PNCAKES 作为我的回报。
翻译不适用于此。 替换对此不起作用。 正则表达式太复杂了...
想法?
【问题讨论】:
标签: oracle string replace substring
是否有从给定位置删除字符的方法?
假设我的话是: 薄煎饼 我想删除第二个字母(在这种情况下,'A'),所以我想要 PNCAKES 作为我的回报。
翻译不适用于此。 替换对此不起作用。 正则表达式太复杂了...
想法?
【问题讨论】:
标签: oracle string replace substring
是的 REPLACE 和 SUBSTR 按正确的顺序就可以了。
最终结果应该是被删除的字符之前的 SUBSTR 与字符之后的 SUBSTR 的串联。
如果整列只有一个单词,那么你可以做一个更新,如果这个单词在另一个字符串中,那么你可以使用 REPLACE 作为包装器。
【讨论】:
例子:
SUBSTR('PANCAKES', 0, INSTR('PANCAKES', 'A', 1, 1)-1) || SUBSTR('PANCAKES', INSTR('PANCAKES', 'A', 1, 1)+1)
我没有要测试的 Oracle 实例,可能需要调整 -1/+1 以使位置正确。
参考资料:
【讨论】:
您应该强烈考虑使用regexp_replace。它更短,也没有乍一看那么复杂:
SELECT REGEXP_REPLACE( S, '^(.{1}).', '\1' )
FROM (
SELECT 'PANCAKES'
FROM DUAL
)
模式 ^(.{1}). 从字符串的开头(由 ^ 表示)搜索恰好一个 (.{1}) 可打印或可上打印字符,然后再仅搜索其中一个字符 (.)。 “精确”部分用括号括起来,因此可以通过第三个函数参数 (\1) 中的编号将其作为匹配组引用。所以正则表达式匹配的整个子串是'PA',但我们只引用'P'。其余的字符串保持不变。所以结果是“PNCAKES”。
如果您想从字符串中删除第 N 个字符,只需将模式中的数字“one”(用于删除第二个字符)替换为 N-1 的值。
熟悉正则表达式对程序员或任何类型的 IT 专家都有好处,因为它赋予了他或她处理文本条目的强大能力。
【讨论】:
或者使用 SUBSTR 使用定制的 SplitAtPos 函数。优点是它仍然适用于 Oracle v9。
set serveroutput on
declare
s1 varchar2(1000);
s2 varchar2(1000);
function SplitAtPos(s in out varchar2, idx pls_integer)
return varchar2
is
s2 varchar2(1000);
begin
s2:=substr(s,1,idx-1);
s:=substr(s,idx,length(s)-idx+1);
return s2;
end;
begin
s1:='Test123';
s2:=SplitAtPos(s1,1);
dbms_output.put_line('s1='||s1||' s2='||s2);
s1:='Test123';
s2:=SplitAtPos(s1,5);
dbms_output.put_line('s1='||s1||' s2='||s2);
s1:='Test123';
s2:=SplitAtPos(s1,7);
dbms_output.put_line('s1='||s1||' s2='||s2);
s1:='Test123';
s2:=SplitAtPos(s1,8);
dbms_output.put_line('s1='||s1||' s2='||s2);
s1:='Test123';
s2:=SplitAtPos(s1,0);
dbms_output.put_line('s1='||s1||' s2='||s2);
end;
【讨论】:
你可以在pl/SQL中使用类似的东西
DECLARE
v_open NUMBER;
v_string1 VARCHAR2(10);
v_string2 VARCHAR2(10);
v_word VARCHAR2(10);
BEGIN
v_open := INSTR('PANCAKES' ,'A',1);
v_string1 := SUBSTR('PANCAKES' ,1, 1);
v_string2 := SUBSTR('PANCAKES' ,v_open+1);
v_word := v_string1||v_string2;
END;
【讨论】: