0

我正在尝试找到最接近 substr 的分隔符,并且对字符数有限制。

Eg: select 'oneone,twotwo, threethree, four,five,six,seven,eight,nine,ten,eleven,twelve' from dual;

现在,我想限制 substr 仅从该字符串中提取前 30 个字符,同时确保 substr 以最近的 "," 结尾,如果它无法在 30 个字符中找到终点。

select substr('oneone,twotwo, threethree, four,five,six,seven,eight,nine,ten,eleven,twelve',1,30) from dual ;-- First 30 characters.

前 30 个字符产生:oneone,twotwo,threethree,fou 但是,我希望预期的结果是在“fou”的不完整输入之前找到最近的分隔符“,”并得到结果。

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

1 回答 1

1

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

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 个字符的字符串中最后一个逗号之前的位置。

于 2012-08-24T18:05:18.857 回答