2012-03-18 21 views
7

Nếu tôi sử dụng các biểu thức sau đây, kết quả nên 1.Sử dụng regexp_instr để có được số cuối cùng trong một chuỗi

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

Có cách nào để làm cho cái nhìn này cho số cuối cùng trong chuỗi? Nếu tôi tìm số cuối cùng trong ví dụ trên, nó sẽ trả lại 3.

+0

Không có 3 hoặc 1 trong ví dụ của bạn, tôi nghĩ bạn đã làm điều gì đó sôi nổi ở đó với [[: digit:]]. Ngoài ra, trước tiên bạn nói kết quả nên là 1 sau đó bạn nói nó nên được 3. Xin vui lòng làm rõ. Cuối cùng có thể có các ký tự không phải chữ số khác trong chuỗi sau chữ số cuối cùng? –

+0

Khi tôi chạy regexp_instr với một chuỗi khác nhau (Đơn vị 4/22-24 Adams Pde) kết quả là 6, trong trường hợp đó, là chỉ số của số đầu tiên. – MissPiplup

+1

Tôi đã thực hiện một lỗi đánh máy ở đó. Đối với ví dụ được cung cấp, nó sẽ trả lại 1. Nếu tôi đã làm cho nó tìm số cuối cùng, nó sẽ nhổ trở lại 3 - chỉ số của '0' thứ hai. – MissPiplup

Trả lời

10

Nếu bạn đang sử dụng 11g, bạn có thể sử dụng regexp_count để xác định số lần mẫu tồn tại trong chuỗi và nạp vào các regexp_instr

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

Kể từ khi bạn đang ở trên 10g, tuy nhiên, tùy chọn đơn giản nhất có lẽ là để đảo ngược chuỗi và trừ các vị trí đó được tìm thấy ở độ dài của chuỗi

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

Cả hai phương pháp nên làm việc trong 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

Cảm ơn, nó đã hoạt động – MissPiplup

1

Một giải pháp với nỗ lực ít là

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

này có thể được đọc như .. tìm ra phi chữ số ở phần cuối của chuỗi. và trừ 1. sẽ cho vị trí của chữ số cuối cùng trong chuỗi ..

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

mà tôi nghĩ là những gì bạn muốn.

(thử nghiệm trên 11g)

Các vấn đề liên quan