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