2015-05-04 155 views
0

/SQL 我有这些文字:提取一些字符在PL INSTR

${cat};${dog}; 

我想提取这些:

${dog} 

我与INSTR努力,但永诺显示我的最后分号这些:

SELECT substr(field,instr(field,'$',1,2),instr(field,';',1,2)-1),... 

任何帮助,请

+0

你需要在分号分隔列表中的第二个条目,或特别是 “$ {}狗”? –

回答

0

功能被定义为substr(str, pos, len),所以你必须要减去的第三个参数的位置为substr(str, pos1, pos2 - pos1)

0

不知道这是否是你所需要的,但我想代码:如果找

select substr('${cat};${dog};' 
      ,instr('${cat};${dog};',';',1,1)+1 
      ,instr('${cat};${dog};',';',1,2)-instr('${cat};${dog};',';',1,1)-1 
      ) 
    from dual; 
0

对于列表中的第二项,这里是使用REGEXP_SUBSTR()函数返回第二次出现的一组零个或多个不是分号的字符,它们后面跟着一个分号或者结尾线。这使得在列表中的NULL值:

select REGEXP_SUBSTR('${cat};${dog};', '([^;]*)(;|$)', 1, 2, NULL, 1) from dual; 

更妙的是,拨打电话到REGEXP_SUBSTR通用,并把它变成你传递一个字符串,你需要的元素和分隔符存储功能,并使其返回字符串。

优点:

- Logic and code is encapsulated in a reusable function all can use without having to understand the regular expression syntax (but still get the power from it) 
- There is a consistent, simple way to call it 
- Code becomes MUCH easier to follow/debug 
- If it needs to change there is only one place to change it 
- A particular element of a list can be SELECTed 
- An element of a list can be used in a WHERE clause 

下面是函数定义本身:

FUNCTION GET_LIST_ELEMENT(string_in VARCHAR2, element_in NUMBER, delimiter_in VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS 
    BEGIN 
     RETURN REGEXP_SUBSTR(string_in, '([^\'||delimiter_in || ']*)(\'||delimiter_in||'|$)', 1, element_in, NULL, 1); 
    END GET_LIST_ELEMENT;