【问题标题】:Use Oracle INSTR function to search for multiple strings使用 Oracle INSTR 函数搜索多个字符串
【发布时间】:2011-01-02 03:11:59
【问题描述】:

在 Oracle/PLSQL 中,instr 函数返回字符串中子字符串的位置。

如果未找到子字符串,则instr 将返回0

我想在一个字符串中搜索多个子字符串并返回第一个非零值。这可以使用regexp_instr 来实现,但我想要一个非regexp_ 的解决方案。

示例:

regexp_instr('500 Oracle Parkway, Redwood Shores, CA','(Apple|Park|Shores)')

应该返回 12('Park' 的位置)。

【问题讨论】:

    标签: sql regex oracle string


    【解决方案1】:

    INSTR 不支持正则表达式 OR - 您必须为要检查的每个子字符串定义 INSTR 函数调用。 regexp_instr('500 Oracle Parkway, Redwood Shores, CA','(Apple|Park|Shores)') 的等价物是:

    WHERE (INSTR('500 Oracle Parkway, Redwood Shores, CA', 'Apple') > 0
          OR
          INSTR('500 Oracle Parkway, Redwood Shores, CA', 'Park') > 0
          OR
          INSTR('500 Oracle Parkway, Redwood Shores, CA', 'Shores') > 0)
    

    根据您的需要,全文搜索功能可能更符合您的需求?

    【讨论】:

      【解决方案2】:

      显然,如果没有 regexp,就不会有如此优雅的解决方案,除非您编写自己的 PL/SQL 函数来完成相同的工作。否则你将不得不这样做:

      with data as (select '500 Oracle Parkway, Redwood Shores, CA' string from dual)
      select nvl(min(pos),0) from
      ( select instr(data.string, 'Apple') pos
        union all
        select instr(data.string, 'Park') pos
        union all
        select instr(data.string, 'Shores') pos
      )
      where pos > 0;
      

      【讨论】:

      • 我发现这是一个了不起的答案!所以我试了一下。我看了看它的表现。它从 PL/SQL 解释器向 Oracle 发送查询 - 换句话说,这是一种非常缓慢的方式来做你想做的事情!
      • @Schlump:“从 PL/SQL 解释器向 Oracle 发送查询”?
      • 是的,我也很想知道这意味着什么,但让它过去吧。我想是来自 PL/SQL 的 SQL。
      • 它必须将它传递给 PL/SQL 引擎,因为这不是一个可以使用索引或简单子字符串轻松执行的操作。如果性能至关重要,请使用确定性函数编写包,返回第一个非 0 位置,然后可以将其用于计算索引。
      【解决方案3】:

      请检查以下---

      select regexp_instr ('500 Oracle Parkway, Redwood Shores, CA', 'Apple|Park|Shores', 1, 1, 0, 'i') as result
      from dual;
      

      【讨论】:

      • OP 明确要求没有正则表达式的解决方案。
      【解决方案4】:
      select 
          coalesce(
              nullif(instr('500 Oracle Parkway, Redwood Shores, CA','Apple'),0),
              nullif(instr('500 Oracle Parkway, Redwood Shores, CA','Park'),0),
              nullif(instr('500 Oracle Parkway, Redwood Shores, CA','Shores'),0)
          ) as xxx
      from dual
      

      【讨论】:

        【解决方案5】:

        据我所知,instr 不会给出字符串中字符的每个位置,所以如果需要,请使用下面的代码。

         SELECT literal,indx FROM  (SELECT substr('HelloWorld',level,1) as literal,level as indx FROM DUAL CONNECT BY LEVEL <= length('HelloWorld'))WHERE literal IN ('l','o') ORDER BY literal
        

        在上面我检查了字符串'HelloWorld'中的文字'l',上面的查询给出了所有匹配的位置。您可以将上面的代码增强为功能并根据要求使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-31
          • 1970-01-01
          • 2018-12-06
          • 2020-09-26
          • 2012-02-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多