2012-03-18 14 views
7

Jeżeli użyłem następujące wyrażenie, wynik powinien być 1.Zastosowanie regexp_instr dostać ostatnią liczbę w ciąg

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

Czy istnieje sposób, aby ten wygląd ostatniego numeru w ciągu? Jeśli miałbym szukać ostatniego numeru w powyższym przykładzie, powinien on powrócić 3.

+0

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? –

+0

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

+1

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

Odpowiedz

10

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

Dzięki, zadziałało – MissPiplup

1

Innym rozwiązaniem przy mniejszym wysiłku jest

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

to można odczytać jako .. znaleźć non-cyfr na końcu łańcucha. i odejmij 1., co da pozycję ostatniej cyfry w ciągu ..

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

co według mnie jest tym, czego chcesz.

(testowane na 11g)

Powiązane problemy