Vấn đề:
Bạn muốn tách một chuỗi trong Oracle.
Ví dụ:
Bạn có một câu và bạn muốn chia nó bằng ký tự khoảng trắng.
Giải pháp:
SELECT REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL;
Bảng kết quả trông như thế này:
phần |
---|
An |
ví dụ |
. |
Thảo luận:
Để lấy chuỗi con từ một chuỗi, bạn có thể sử dụng hàm REGEXP_SUBSTR () tích hợp sẵn của Oracle. Nó có bốn đối số:
- Chuỗi được tìm kiếm cho một chuỗi con.
- Biểu thức chính quy; tức là mẫu bạn muốn tìm.
- Vị trí mà bạn muốn bắt đầu tìm kiếm mẫu (giá trị mặc định là 1, nghĩa là bắt đầu từ đầu chuỗi).
- Số chỉ định sự xuất hiện của chuỗi con phù hợp mà bạn muốn xem (giá trị mặc định là
1
, có nghĩa là chuỗi con phù hợp đầu tiên sẽ được hiển thị).
Trong ví dụ của chúng tôi, chuỗi được tìm kiếm là 'An example sentence.
'Trong chuỗi, bạn tìm kiếm các chuỗi con là các từ, mà chúng tôi xác định ở đây là bất kỳ nhóm ký tự nào ngoại trừ dấu cách. Đây là lý do tại sao chúng tôi chỉ định mẫu '[^ ]+
', tức là bất kỳ chuỗi ký tự không phải dấu cách nào. [^ ]
là viết tắt của bất kỳ ký tự nào ngoại trừ dấu cách và +
dấu hiệu là viết tắt của một hoặc nhiều lần xuất hiện của các ký tự như vậy. Đối số thứ ba phải là đối số mặc định (1
), vì bạn muốn tìm kiếm các từ trong toàn bộ chuỗi ngay từ đầu. Đối số cuối cùng là đối số khó nhất - bạn cần giá trị của nó thay đổi cho mỗi chuỗi được tìm kiếm. Nó phải là mức - một cột giả có sẵn trong các truy vấn phân cấp bằng cách sử dụng CONNECT BY
- trong trường hợp của chúng tôi, sẽ bằng số hàng của hàng hiện tại trong kết quả khi CONNECT BY được sử dụng. Vì vậy, bạn có:
REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level)
Biểu thức này phải được chọn từ dual
- một giá trị giả được sử dụng trong Oracle khi bạn không chọn từ một bảng thực tế. Sau đó, bạn nên CONNECT BY
toán tử truy vấn phân cấp, với điều kiện chuỗi con được truy xuất không được NULL
. Chuỗi con được truy xuất sẽ là NULL khi tất cả các từ được truy xuất; sau đó truy vấn phân cấp sẽ dừng việc thực thi. Vì vậy, bạn có:
FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL
Bạn có thể đọc ở đây về cấp độ và KẾT NỐI BẰNG.
Nếu bạn muốn chia chuỗi bằng một số dấu phân cách khác, bạn có thể dễ dàng sửa đổi truy vấn. Ví dụ:nếu bạn muốn chia chuỗi bằng dấu phẩy, hãy thay đổi '[^ ]
+ 'thành' [^,]+
'. Đây là một truy vấn mẫu:
SELECT REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) IS NOT NULL;