0

输入 :

start1
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
start2

我想捕获 start1 和 start2 之间的任何字符串。它们之间的字符串将是可变的。输出:

david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com

使用子字符串/索引函数

4

3 回答 3

0

如果它在 pl/sql 中,那么你可以这样做:

SQL> declare
  2    v_str varchar2(2000) := 'start1
  3  david@gmail.com
  4  david@gmail.com
  5  david@gmail.com
  6  david@gmail.com
  7  david@gmail.com
  8  david@gmail.com
  9  david@gmail.com
 10  start2';
 11    v_newstr varchar2(2000);
 12    v_start_delim varchar2(10) := 'start1';
 13    v_end_delim varchar2(10) := 'start2';
 14  begin
 15    v_newstr := substr(v_str, instr(v_str, v_start_delim)+length(v_start_delim),
 16                       instr(v_str, v_end_delim) - instr(v_str, v_start_delim) - length(v_start_delim));
 17
 18    -- remove leading/trailing breaks.
 19    v_newstr := trim(both chr(10) from v_newstr);
 20    dbms_output.put_line(v_newstr);
 21
 22  end;
 23  /
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com

PL/SQL procedure successfully completed.

或者如果您在 SQL 中有字符串(假设字符串都在一行中)

SQL> select trim(both chr(10) from
 2           substr(str, instr(str, 'start1')+length('start1'),
 3                instr(str, 'start2') - instr(str, 'start1') - length('start1'))
 4         ) newstr
 5    from data;

NEWSTR
-----------------------
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
david@gmail.com
于 2013-02-26T08:15:11.907 回答
0

我在这里猜测是因为无法理解需要什么:

SELECT TRIM(SUBSTR(str, start1+1, btwn_starts)) final_str
  FROM
  (
  SELECT 'start1 '||' some data in between '||' start2' str
        , Length('start1') start1
        , Length('start2') start2 
        , Length(' some data in between ') btwn_starts
    FROM dual
  )
 /

Output string: some data in between
于 2013-02-25T15:31:33.700 回答
0

首先,您必须使用 order by。根据 SQL 规则,如果您不使用 order by,那么数据库可以按任何顺序返回结果,甚至与上次执行相同查询时不同。

假设您按 id 进行排序,并且您要查询的字段名称是 name

select name
from table1
where id > (select id from table1 where name = 'start1')
  and id < (select id from table1 where name = 'start2')
order by id
于 2013-02-25T14:54:35.720 回答