Regexp_substr hoạt động theo cách này:
Nếu số lần xuất hiện lớn hơn 1, thì cơ sở dữ liệu tìm kiếm lần xuất hiện thứ hai bắt đầu bằng ký tự đầu tiên sau lần xuất hiện đầu tiên của mẫu , và kể từ đó trở đi. Hành vi này khác với hàm SUBSTR, hàm này bắt đầu tìm kiếm lần xuất hiện thứ hai ở ký tự thứ hai của lần xuất hiện đầu tiên.
Vì vậy, mẫu [^ |] sẽ tìm kiếm các đường ống NON, nghĩa là nó sẽ bỏ qua các đường ống liên tiếp ("||") để tìm kiếm một ký tự không phải là đường ống dẫn.
Bạn có thể thử:
select trim(regexp_substr(replace('A|test||string', '|', '| '), '[^|]+', 1, 4)) from dual;
Điều này sẽ thay thế dấu "|" với "|" và cho phép bạn so khớp dựa trên mẫu [^ |]