sql在某些单词之间搜索字符串

时间:2012-09-10 19:06:47

标签: sql plsql

如果关键字是“查找”,是否可以提取“查找”之间的字符串?

stackoverflow is awesome. FindHello, World!Find It has everything!

结果应该是'Hello,World!'因为字符串在“查找”之间 我最初的想法是使用Instr找到两个“查找”,然后找到“查找”之间的内容。

有没有更好的方法呢?

2 个答案:

答案 0 :(得分:2)

您可以使用regular expressionsinstr()来实现您的目标。

我实际上更喜欢正则表达式,如果你使用的是10g或更高版本,因为我发现使用instr()进行多次扭曲相当笨拙,但这取决于你。

with phrases as (
  select 'stackoverflow is awesome. FindHello, World!Find It has everything!' as phrase
    from dual
         )
select substr( phrase
             , instr(phrase,'Find',1,1) + 4
             , instr(phrase,'Find',1,2) 
                 - instr(phrase,'Find',1,1)
                 - 4
               )
  from phrases

这将从第一个字符开始获取字符串Find的第一次和第二次出现,然后使用这些字符来计算您应该在子字符串上执行的位置。

或者,使用正则表达式:

with phrases as (
  select 'stackoverflow is awesome. FindHello, World!Find It has everything!' as phrase
    from dual
         )
select regexp_replace(phrase
     , '([[:print:]]+Find)([[:print:]]+)(Find[[:print:]]+)', '\2')
  from phrases
       ;

这会多次使用任何可打印字符,然后是字符串Find等。但是,主要位是分组(),它将短语的每个部分分开。 \2表示原始匹配字符串仅包含第二个组,即返回Find之间的字符串。

这里有一点SQL Fiddle来演示。

答案 1 :(得分:1)

此查询假设处理两个以上的“查找”

with SourceString as( 
   select 'Find123Find45345Find76876234Find87687Find' s_string
        , 'Find' delimiter 
     from dual
)  

select substr(s_string, f_f - s_f + length(delimiter), s_f-Length(delimiter ) )
  from (select f_f
             , s_f
         from(select f_f
                   , f_f  - lag(f_f, 1, f_f) over(order by 1) s_f 
                from (select Instr(s_string, delimiter , 1, level) f_f
                        from SourceString
                     connect by level <= Length(s_string))
                     )
       where s_f > 0) 
     , SourceString