Awas! Ekspresi regexp_substr dari format '[^,]+'
tidak akan mengembalikan nilai yang diharapkan jika ada elemen nol dalam daftar dan Anda menginginkan item itu atau setelahnya. Pertimbangkan contoh ini di mana elemen ke-4 adalah NULL dan saya ingin elemen ke-5 dan dengan demikian mengharapkan '5' dikembalikan:
SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;
R
-
6
Kejutan! Ini mengembalikan elemen NON-NULL ke-5, bukan elemen ke-5 yang sebenarnya! Data yang salah dikembalikan dan Anda bahkan mungkin tidak menangkapnya. Coba ini sebagai gantinya:
SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;
R
-
5
Jadi, REGEXP_SUBSTR yang dikoreksi di atas mengatakan untuk mencari kemunculan ke-5 dari 0 atau lebih karakter yang dipisahkan koma diikuti dengan koma atau akhir baris (memungkinkan untuk pemisah berikutnya, baik koma atau akhir baris) dan ketika ditemukan kembalikan subgrup pertama (data TIDAK termasuk koma atau akhir baris).
Pola pencocokan pencarian '(.*?)(,|$)'
dijelaskan:
( = 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
EDIT:Info lebih lanjut ditambahkan dan menyederhanakan ekspresi reguler.
Lihat posting ini untuk info lebih lanjut dan saran untuk merangkum ini dalam fungsi agar mudah digunakan kembali:REGEX untuk memilih nilai ke-n dari daftar, memungkinkan untuk nullsIni adalah posting tempat saya menemukan format '[^,]+'
memiliki masalah. Sayangnya ini adalah format regex yang paling sering Anda lihat sebagai jawaban untuk pertanyaan tentang cara mengurai daftar. Saya ngeri memikirkan semua data yang salah dikembalikan oleh '[^,]+'
!