2012-03-18 16 views
7

Si usara la siguiente expresión, el resultado debería ser 1.Uso regexp_instr para obtener el último número en una cadena

regexp_instr('500 Oracle Parkway, Redwood Shores, CA','[[:digit:]]') 

¿Hay una manera de hacer esta mirada para el último número de la cadena? Si tuviera que buscar el último número en el ejemplo anterior, debería devolver 3.

+0

No hay 3 o 1 en su ejemplo, creo que hizo algo funky allí con [[: digit:]]. Además, primero dice que el resultado debe ser 1 y luego dice que debería ser 3. Por favor, aclare. Finalmente, ¿puede haber otros caracteres que no sean dígitos en la cadena después del dígito final? –

+0

Cuando ejecuté regexp_instr con una cadena diferente (Unidad 4/22-24 Adams Pde) el resultado fue 6, que, en ese caso, era el índice del primer número. – MissPiplup

+1

Hice un error tipográfico allí. Para el ejemplo proporcionado, debe devolver 1. Si tuviera que hacer que busque el último número, debería escupir 3 - el índice del segundo '0'. – MissPiplup

Respuesta

10

Si estaba usando 11g, podría usar regexp_count para determinar el número de veces que existe un patrón en la cadena y alimentarlo en la regexp_instr

regexp_instr(str, 
       '[[:digit:]]', 
       1, 
       regexp_count(str, '[[:digit:]]') 
      ) 

Ya que estás en 10g, sin embargo, la opción más sencilla es probablemente para revertir la cadena y restar la posición que se encuentra a partir de la longitud de la cadena

length(str) - regexp_instr(reverse(str),'[[:digit:]]') + 1 

Ambos enfoques deben trabajar en 11g

SQL> ed 
Wrote file afiedt.buf 

    1 with x as (
    2 select '500 Oracle Parkway, Redwood Shores, CA' str 
    3  from dual 
    4 ) 
    5 select length(str) - regexp_instr(reverse(str),'[[:digit:]]') + 1, 
    6   regexp_instr(str, 
    7      '[[:digit:]]', 
    8      1, 
    9      regexp_count(str, '[[:digit:]]') 
10     ) 
11* from x 
SQL>/

LENGTH(STR)-REGEXP_INSTR(REVERSE(STR),'[[:DIGIT:]]')+1 
------------------------------------------------------ 
REGEXP_INSTR(STR,'[[:DIGIT:]]',1,REGEXP_COUNT(STR,'[[:DIGIT:]]')) 
----------------------------------------------------------------- 
                3 
                   3 
+0

Gracias, funcionó – MissPiplup

1

Otra solución con menos esfuerzo es

SELECT regexp_instr('500 Oracle Parkway, Redwood Shores, CA','[^[:digit:]]*$')-1 
FROM dual; 

esto puede ser leído como .. encontrar la no-dígitos al final de la cadena. y restar 1. que dará a la posición del último dígito de la cadena ..

REGEXP_INSTR('500ORACLEPARKWAY,REDWOODSHORES,CA','[^[:DIGIT:]]*$')-1 
-------------------------------------------------------------------- 
                    3 

que creo que es lo que desea.

(probado en 11 g)

Cuestiones relacionadas