我有两个字符串:
A_string := 'abc;def;gh;ijkl;....
B_string := '5;43;43;xyz;....
根据A_string中";"
的数量,我需要从pos获取子串。 1到相当于“;”的数量的位置在A_string。
例如: A_string有2“;”在里面。 来自B_string的子串的结果是“5; 43”
我可以按REGEXP_COUNT
获取该号码,但如果我使用REGEXP_SUBSTR
,则结果为“43”。有没有办法返回“5; 43”?
EX:
declare
list varchar2(2000) := '100;200;300;400;500;600;700;800';
corr varchar2(2000) := '1;1;1;2;4;4;4;4;3;3;1;1;1;1';
-- In "real life" corr always has equal or fewer ";"
-- corr can contain ";;;;;;4" or NULL as well
cnt integer;
res varchar2(2000);
begin
cnt := REGEXP_COUNT(list,';');
res := REGEXP_SUBSTR(corr, '[^;]+',1,cnt);
dbms_output.put_line(res);
-- output is 4
-- want it to be 1;1;1;2;4;4;4;4
-- The result is used to put a substr of list and corr into corresponding cells in 2 tables
-- and pass them on to another procedure. This procedure can't handle the number of "cells" in list/corr,
-- and my procedure can only retrieve 2 long strings.
end;
答案 0 :(得分:1)
instr有额外的参数来计算一些匹配。以下是获得' gh'
的示例with t (select 'abc;def;gh;ijkl' a_string from dual)
select subtr(a_string, instr(a_string, ';', 1, 2),
instr(a_string, ';', 1, 3)-instr(a_string, ';', 1, 2)) from t
啊哈..我想,我现在明白了:)
第一步 - 查找';'在一个字符串中:
select length(a_string) - length(replace(a_string, ';', '')) cnt from t
然后使用它从第二个字符串中获取子字符串。如果第二个字符串中没有cnt + 1分号,则将其全部删除,否则在下一个分号处剪切:
select decode( instr(b_string, ';', 1, cnt+1), 0, b_string,
substr(b_string, 1, instr(b_string, ';', 1, cnt+1)) from t2