获取SQL / PL SQL中特定字符之前和之后的值?

时间:2017-02-08 09:02:53

标签: sql oracle plsql

我有一个字符串值作为参数,我需要解析它。我的价值是:

param := ('1234@5432@4567@8763');

我必须部分获得1234543245678763值。我将这些值设置为不同的参数。

如何使用SQL解决它?

谢谢,

2 个答案:

答案 0 :(得分:0)

假设您使用PL / SQL并且需要将参数或变量的值拆分为四个变量,这可能是一种方式:

declare
    param    varchar2(100);
    param1   varchar2(100);
    param2   varchar2(100);
    param3   varchar2(100);
    param4   varchar2(100);
begin    
    param := '1234@5432@4567@8763';
    --
    param1 := substr(param, 1, instr(param, '@', 1, 1)-1);
    param2 := substr(param, instr(param, '@', 1, 1) +1 , instr(param, '@', 1, 2) - instr(param, '@', 1, 1)-1);
    param3 := substr(param, instr(param, '@', 1, 2) +1 , instr(param, '@', 1, 3) - instr(param, '@', 1, 2)-1);
    param4 := substr(param, instr(param, '@', 1, 3) +1  );
    --
    dbms_output.put_line('Param1: ' || param1);
    dbms_output.put_line('Param2: ' || param2);
    dbms_output.put_line('Param3: ' || param3);
    dbms_output.put_line('Param4: ' || param4);
end;    

使用正则表达式,您可以通过搜索后跟@或行尾('$'的字符串的第1,第2,......出现来获得相同的结果); Gary_W在其评论

中给出的链接中描述了对这种方法的更好解释
...
param1 := regexp_substr(param, '(.*?)(@|$)', 1, 1, '', 1 );
param2 := regexp_substr(param, '(.*?)(@|$)', 1, 2, '', 1 );
param3 := regexp_substr(param, '(.*?)(@|$)', 1, 3, '', 1 );
param4 := regexp_substr(param, '(.*?)(@|$)', 1, 4, '', 1 );
...

答案 1 :(得分:0)

select level, regexp_substr(a,'\d+',1,level)
from(select '1234@5432@4567@8763' a from dual)
connect by level <= regexp_count(a,'@') + 1