Cảm ơn những người đã trả lời. Sau khi xem xét các câu trả lời của bạn và các câu trả lời trong liên kết được cung cấp, tôi đã đến giải pháp này:
SQL> select REGEXP_SUBSTR('1,,3,4,5', '(.*?)(,|$)', 1, 2, NULL, 1) data
2 from dual;
Data
----
Có thể được mô tả là "nhìn vào lần xuất hiện thứ hai của một tập hợp tùy chọn không hoặc nhiều ký tự được theo sau bởi dấu phẩy hoặc cuối dòng và trả về nhóm con thứ nhất (là dữ liệu trừ dấu phẩy hoặc cuối của dòng).
Tôi quên đề cập đến việc tôi đã thử nghiệm với giá trị rỗng ở nhiều vị trí khác nhau, nhiều giá trị rỗng, chọn nhiều vị trí khác nhau, v.v.
Cảnh báo duy nhất mà tôi có thể tìm thấy là nếu trường bạn tìm kiếm lớn hơn số có sẵn, nó sẽ trả về NULL, vì vậy bạn cần lưu ý điều đó. Không thành vấn đề đối với trường hợp của tôi.
CHỈNH SỬA:Tôi đang cập nhật câu trả lời được chấp nhận vì lợi ích của những người tìm kiếm trong tương lai có thể tình cờ gặp phải điều này.
Bước tiếp theo là đóng gói mã để nó có thể được tạo thành một hàm đơn giản hơn, có thể tái sử dụng. Đây là nguồn chức năng:
FUNCTION GET_LIST_ELEMENT(string_in VARCHAR2, element_in NUMBER, delimiter_in VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
BEGIN
RETURN REGEXP_SUBSTR(string_in, '(.*?)(\'||delimiter_in||'|$)', 1, element_in, NULL, 1);
END GET_LIST_ELEMENT;
Điều này che giấu sự phức tạp của regex khỏi các nhà phát triển, những người có thể không cảm thấy thoải mái với nó và làm cho mã sạch hơn khi sử dụng. Gọi nó như thế này để nhận phần tử thứ 4:
select get_list_element('123,222,,432,555', 4) from dual;