Hãy coi chừng! Biểu thức regexp_substr của định dạng '[^,] +'
sẽ không trả về giá trị mong đợi nếu có một phần tử rỗng trong danh sách và bạn muốn mục đó hoặc một phần tử sau nó. Hãy xem xét ví dụ này, trong đó phần tử thứ 4 là NULL và tôi muốn phần tử thứ 5 và do đó mong muốn trả về '5':
SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;
R
-
6
Bất ngờ! Nó trả về phần tử NON-NULL thứ 5, không phải phần tử thứ 5 thực tế! Dữ liệu không chính xác được trả về và bạn thậm chí có thể không nắm bắt được. Hãy thử cái này thay thế:
SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;
R
-
5
Vì vậy, REGEXP_SUBSTR đã sửa ở trên nói rằng hãy tìm lần xuất hiện thứ 5 của 0 hoặc nhiều ký tự được phân tách bằng dấu phẩy theo sau bởi dấu phẩy hoặc cuối dòng (cho phép dấu phân tách tiếp theo, có thể là dấu phẩy hoặc cuối dòng) và khi được tìm thấy, hãy trả về nhóm con thứ nhất (dữ liệu KHÔNG bao gồm dấu phẩy hoặc cuối dòng).
Mẫu đối sánh tìm kiếm '(. *?) (, | $)'
giải thích:
( = Start a group
. = match any character
* = 0 or more matches of the preceding character
? = Match 0 or 1 occurrences of the preceding pattern
) = End the 1st group
( = Start a new group (also used for logical OR)
, = comma
| = OR
$ = End of the line
) = End the 2nd group
CHỈNH SỬA:Thêm thông tin và đơn giản hóa regex.
Xem bài đăng này để biết thêm thông tin và đề xuất đóng gói điều này trong một hàm để dễ dàng sử dụng lại:REGEX để chọn giá trị thứ n từ danh sách, cho phép nulls Đây là bài đăng mà tôi phát hiện ra định dạng '[^,] +' có vấn đề. Thật không may, đó là định dạng regex mà bạn thường thấy nhất là câu trả lời cho các câu hỏi liên quan đến cách phân tích cú pháp danh sách. Tôi rùng mình khi nghĩ đến việc trả về tất cả dữ liệu không chính xác bởi
'[^,] +'
!