Jeśli używasz 11g, możesz użyć numeru regexp_count
, aby określić, ile razy wzór istnieje w ciągu i podać go regexp_instr
regexp_instr(str,
'[[:digit:]]',
1,
regexp_count(str, '[[:digit:]]')
)
Skoro jesteś na 10g, jednak najprostszym rozwiązaniem jest prawdopodobnie odwrócić ciąg i odejmować pozycję, która znajduje się od długości łańcucha
length(str) - regexp_instr(reverse(str),'[[:digit:]]') + 1
Oba podejścia powinny pracować w 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
Nie ma 3 lub 1 w przykładzie, myślę, że zrobił coś ostry tam z [[: digit:]]. Ponadto, najpierw powiesz, że wynik powinien wynosić 1, a następnie, że powinno być 3. Proszę wyjaśnij. Wreszcie, czy w ciągu po cyfrach końcowych mogą znajdować się inne niecyfrowe znaki? –
Kiedy uruchomiłem regexp_instr z innym ciągiem znaków (Unit 4/22-24 Adams Pde), wynik wyniósł 6, co w tym przypadku było indeksem pierwszej liczby. – MissPiplup
Zrobiłem tam literówkę. Dla podanego przykładu powinieneś zwrócić 1. Jeśli miałbym sprawić, żeby szukał ostatniego numeru, powinien wypluć 3 - indeks drugiego '0'. – MissPiplup