Внимавай! Изразът на regexp_substr във формат '[^,]+'
няма да върне очакваната стойност, ако има нулев елемент в списъка и искате този елемент или един след него. Помислете за този пример, където 4-ти елемент е NULL и искам 5-ти елемент и по този начин очаквам '5' да бъде върнат:
SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;
R
-
6
Изненада! Връща 5-тия NON-NULL елемент, а не действителния 5-ти елемент! Върнати са неправилни данни и може дори да не ги хванете. Опитайте това вместо това:
SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;
R
-
5
И така, коригираният по-горе REGEXP_SUBSTR казва да се търси 5-то появяване на 0 или повече символа, разделени със запетая, последвано от запетая или края на реда (позволява следващия разделител, било то запетая или края на реда) и когато бъде намерен, върнете първата подгрупа (данните НЕ включват запетаята или края на реда).
Моделът за търсене съвпада '(.*?)(,|$)'
обясни:
( = 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
РЕДАКТИРАНЕ:Добавена е повече информация и опростен регулярният израз.
Вижте тази публикация за повече информация и предложение да капсулирате това във функция за лесна повторна употреба:REGEX за избор на n-та стойност от списък, позволявайки nulls. Това е публикацията, в която открих формата '[^,]+'код> има проблема. За съжаление това е форматът на регулярни изрази, който най-често ще виждате като отговор на въпроси относно това как да анализирате списък. Настръхвам като си помисля за всички неправилни данни, които се връщат от
'[^,]+'
!