在Oracle中:如何获得一个子字符串,其中结束位置是给定字符的第n个数字,而不是它自己的位置?

时间:2014-06-04 10:41:50

标签: oracle plsql

我有两个字符串:

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;

1 个答案:

答案 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