无论如何都要删除给定位置的角色?
我们说的是: 薄煎饼 我想删除第二个字母(在这种情况下,'A'),所以我希望PNCAKES作为我的回报。
翻译不适用于此。 替换不起作用。 正则表达式很复杂......
想法?
答案 0 :(得分:4)
示例:
SUBSTR('PANCAKES', 0, INSTR('PANCAKES', 'A', 1, 1)-1) || SUBSTR('PANCAKES', INSTR('PANCAKES', 'A', 1, 1)+1)
我没有要测试的Oracle实例,可能需要调整-1 / + 1以获得正确的位置。
参考文献:
答案 1 :(得分:3)
您应该强烈考虑使用regexp_replace
。它更短,并不像第一眼看上去那么复杂:
SELECT REGEXP_REPLACE( S, '^(.{1}).', '\1' )
FROM (
SELECT 'PANCAKES'
FROM DUAL
)
模式^(.{1}).
从字符串的开头(由^
表示)搜索正好一个(.{1}
)可打印或可升级字符,然后再搜索其中一个字符( .
)。 “精确”部分在括号中闭合,因此可以通过第三个函数的参数(\1
)中的数字引用它作为匹配组。所以regexp匹配的整个子串是'PA',但我们只引用'P'。弦的其余部分保持不变。所以结果是'PNCAKES'。
如果要从字符串中删除第N个字符,只需将模式中的数字“1”替换为(用于删除第二个字符),其值为N-1。
程序员或任何类型的IT专家都可以熟悉正则表达式,因为它可以让他或她有很多权力处理文本条目。
答案 2 :(得分:1)
或者使用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;
答案 3 :(得分:0)
是按正确的顺序REPLACE和SUBSTR可以解决问题。
最终结果应该是删除char之前的SUBSTR与char之后的SUBSTR的串联。
如果整个列只有一个单词,那么你可以只进行更新,如果单词在另一个字符串中,那么你可以使用REPLACE作为包装。
答案 4 :(得分:0)
您可以在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;