2012-03-18 13 views
7

Se ho usato la seguente espressione, il risultato dovrebbe essere 1.Usa REGEXP_INSTR per ottenere l'ultimo numero in una stringa

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

C'è un modo per rendere questo look per l'ultimo numero della stringa? Se dovessi cercare l'ultimo numero nell'esempio precedente, dovrebbe restituire 3.

+0

Non c'è 3 o 1 nel tuo esempio, penso che hai fatto qualcosa di strano lì con [[: digit:]]. Inoltre, per prima cosa dici che il risultato dovrebbe essere 1, quindi dici che dovrebbe essere 3. Per favore, chiarisci. Infine, possono esserci altri caratteri non numerici nella stringa dopo l'ultima cifra? –

+0

Quando eseguivo regexp_instr con una stringa diversa (Unità 4/22-24 Adams Pde) il risultato era 6, che, in quel caso, era l'indice del primo numero. – MissPiplup

+1

Ho fatto un errore di battitura lì. Per l'esempio fornito, dovrebbe restituire 1. Se dovessi cercare l'ultimo numero, dovrebbe restituire 3 - l'indice del secondo '0'. – MissPiplup

risposta

10

Se si utilizza 11g, è possibile utilizzare regexp_count per determinare il numero di volte in cui un motivo esiste nella stringa e inserirlo in il regexp_instr

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

dal momento che si è in 10g, tuttavia, l'opzione più semplice è probabilmente per invertire la stringa e sottrarre la posizione che si trova dalla lunghezza della stringa

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

Entrambi gli approcci dovrebbero lavorare in 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

Grazie, ha funzionato – MissPiplup

1

Un'altra soluzione con meno sforzo è

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

questo può essere letto come .. trovare la non-cifre alla fine della stringa. e sottrarre 1. che darà la posizione del l'ultima cifra della stringa ..

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

che credo sia quello che vuoi.

(testato su 11g)