Sự "lạm dụng" (như Colin 't Hart đã nói) của connected by
có mục đích tốt ở đây:bằng cách sử dụng REGEXP_SUBSTR
bạn chỉ có thể trích xuất một trong 4 kết quả phù hợp (23,34,45,56):regex [^,]+
khớp với bất kỳ chuỗi ký tự nào trong chuỗi không chứa dấu phẩy.
Nếu bạn thử chạy:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token"
FROM DUAL
bạn sẽ nhận được 23
.
và nếu bạn thử chạy:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,1) as "token"
FROM DUAL
bạn cũng sẽ nhận được 23
chỉ có điều bây giờ chúng tôi cũng đặt hai tham số bổ sung :bắt đầu tìm kiếm ở vị trí 1 (là vị trí mặc định) và trả về lần xuất hiện đầu tiên.
Bây giờ hãy chạy:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,2) as "token"
FROM DUAL
lần này chúng ta sẽ nhận được 34
(Lần xuất hiện thứ 2) và sử dụng 3
vì tham số cuối cùng sẽ trả về 45
và như vậy.
Việc sử dụng connected by
cùng với level
đảm bảo rằng bạn sẽ nhận được tất cả các kết quả có liên quan (mặc dù vậy không nhất thiết phải theo thứ tự ban đầu!):
SELECT DISTINCT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) as "token"
FROM DUAL
CONNECT BY REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) IS NOT NULL
order by 1
sẽ trở lại:
TOKEN
23
34
45
56
không chỉ chứa tất cả 4 kết quả mà còn chia nó thành các hàng riêng biệt trong tập kết quả!
Nếu bạn loay hoay với nó - nó có thể cung cấp cho bạn một cái nhìn rõ ràng hơn về chủ đề.