Sql 具有分隔符作用域的oracle substr函数

Sql 具有分隔符作用域的oracle substr函数,sql,oracle10g,Sql,Oracle10g,我正在尝试查找与子字符串最接近的分隔符,该子字符串的字符数有限制 Eg: select 'oneone,twotwo, threethree, four,five,six,seven,eight,nine,ten,eleven,twelve' from dual; select substr('oneone,twotwo, threethree, four,five,six,seven,eight,nine,ten,eleven,twelve',1,30) from dual ;-- Firs

我正在尝试查找与子字符串最接近的分隔符,该子字符串的字符数有限制

Eg: select 'oneone,twotwo, threethree, four,five,six,seven,eight,nine,ten,eleven,twelve' from dual;
select substr('oneone,twotwo, threethree, four,five,six,seven,eight,nine,ten,eleven,twelve',1,30) from dual ;-- First 30 characters.
现在,我想限制substr,使其仅从该字符串中提取前30个字符,同时确保substr在30个字符中找不到端点时以最接近的“.”结尾

Eg: select 'oneone,twotwo, threethree, four,five,six,seven,eight,nine,ten,eleven,twelve' from dual;
select substr('oneone,twotwo, threethree, four,five,six,seven,eight,nine,ten,eleven,twelve',1,30) from dual ;-- First 30 characters.
前30个字符产生:一、二、二、三、四 但是,我希望预期结果在“fou”的不完整条目之前找到最近的分隔符“”,并得到结果

Expected Result:oneone,twotwo, threethree -- since "fou" is incomplete and thus should be excluded

很有可能有一个更简单的解决方案,但是

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2    select 'oneone,twotwo, threethree, four,five,six,seven,eight,nine,ten,eleven,twelve' str
  3      from dual
  4  )
  5  select substr( x.str,
  6                 1,
  7                 instr( substr( x.str, 1, 30 ),
  8                        ',',
  9                        -1 ) -1)
 10*   from x
SQL> /

SUBSTR(X.STR,1,INSTR(SUBS
-------------------------
oneone,twotwo, threethree
将工作,当你打破它,相对容易遵循

从里到外工作

substr( x.str, 1, 30 )
获取字符串的前30个字符

instr( substr( x.str, 1, 30 ),
       ',',
       -1 ) 
提供30个字符字符串中最后一个逗号的位置。那么

substr( x.str,
        1,
        instr( substr( x.str, 1, 30 ),
               ',',
               -1 ) -1)

将字符串从位置1移到30个字符字符串中最后一个逗号之前的位置。

谢谢Justin…适合我!但是,如果有一个有效的方法(请允许),我也很高兴听到这个消息。但是,目前这一切都很好。