我们经常遇到字符串的提取,。
INSTR
INSTR函数 :返回一个字符串在另一个更大的字符串中出现的字符位置。
declare
names varchar2(60) := 'Anna,Matt,Joe,Nathan,Andrew,Aaron,Jeff';
comma_location number := 0;
begin
-- Test statements here
loop
comma_location := instr(names,',',comma_location + 1);
exit when comma_location = 0;
dbms_output.put_line(comma_location);
end loop;
end;
输出结果:
INSTR 函数的第一个参数是被检索的字符串,第二个参数是要检索的字符串(示例中是逗号),第三个参数是指明开始检索的字符串位置。
没发现一个逗号,下一次的循环就从这个逗号的下一个字符继续查找。没有发现匹配的逗号,instr就返回0,循环结束。
返回的是第二个参数(要检索的字符串)的开始位置,这个和要检索的字符串的本身的长度无关,将上诉的示例进行修改:
declare
names varchar2(60) := 'Anna,,Matt,,Joe,,Nathan,,Andrew,,Aaron,,Jeff';
comma_location number := 0;
begin
-- Test statements here
loop
comma_location := instr(names,',,',comma_location + 1);
exit when comma_location = 0;
dbms_output.put_line(comma_location);
end loop;
end;
输出结果:
SUBSTR
字符串发现位置就是要进行提取
declare
names varchar2(60) := 'Anna,Matt,Joe,Nathan,Andrew,Aaron,Jeff';
comma_location number := 0;
names_adjusted varchar2(61);
prev_location number:= 0;
begin
-- Test statements here
names_adjusted := names || ',';
loop
comma_location := instr(names_adjusted,',',comma_location+1);
exit when comma_location = 0;
dbms_output.put_line(substr(names_adjusted,prev_location + 1, comma_location - prev_location - 1));
prev_location := comma_location;
end loop;
end;
运行结果:
首先介绍 substr()
第一个参数是:要从中提取名字的字符串。
第二个参数是:名字的第一个字符所在的位置。
第三个参数是:要提取的字符数量。
程序分析:
首先在字符串的末尾加一个逗号,这样就不会把最后的一个值检索出来。
变量 prev_location 和 comma_location 分别指向要打印的名字的名字俩边的位置。
prev_location 指向的是要显示的名字之前的一个字符,也就是名字前面的那个逗号,所以要为prev_location + 1。
comma_location - prev_location - 1 避免结尾的逗号。
但面对这样的情况就不行了
declare
names varchar2(60) := 'Anna,,Matt,,Joe,,Nathan,,Andrew,,Aaron,,Jeff';
comma_location number := 0;
names_adjusted varchar2(61);
prev_location number:= 0;
begin
-- Test statements here
names_adjusted := names || ',,';
loop
comma_location := instr(names_adjusted,',,',comma_location+1);
exit when comma_location = 0;
dbms_output.put_line(substr(names_adjusted,prev_location + 1, comma_location - prev_location - 1));
prev_location := comma_location;
end loop;
end;
运行结果: