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
fonte
2012-03-18 03:26:31
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? –
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
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