2010-01-06 17 views
5

En Oracle/PLSQL, la función instr devuelve la ubicación de una subcadena en una cadena.Usar la función INSTR de Oracle para buscar múltiples cadenas

Si no se encuentra la subcadena, entonces instr devolverá 0.

Quiero buscar varias cadenas secundarias en una cadena y devolver el primer valor distinto de cero. Esto se puede lograr utilizando regexp_instr, pero me gustaría una solución que no sea regexp_.

Ejemplo:

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

debe devolver 12 (la ubicación de 'Park').

Respuesta

4

INSTR no admite OR regex: debe definir las llamadas a la función INSTR para cada subcadena que desee verificar. El equivalente de regexp_instr('500 Oracle Parkway, Redwood Shores, CA','(Apple|Park|Shores)') sería:

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) 

Dependiendo de sus necesidades, la funcionalidad de búsqueda de texto completo puede haber más hacia lo que quiere?

2

Obviamente, sin regexp no habrá una solución tan elegante, a menos que escriba su propia función PL/SQL que hace el mismo trabajo. De lo contrario, tendría que hacer algo como esto:

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; 
+0

¡He encontrado que esta es una respuesta increíble! Así que lo intenté. Y eché un vistazo a su rendimiento. Envía la consulta a Oracle desde el intérprete PL/SQL. En otras palabras, esta es una forma muy lenta de hacer lo que estás tratando de hacer. –

+0

¡No lo dudo! –

+0

@Schlump: "envía la consulta a Oracle desde el intérprete PL/SQL"? –

Cuestiones relacionadas