Strzec się! Wyrażenie regexp_substr formatu '[^,]+'
nie zwróci oczekiwanej wartości, jeśli na liście znajduje się element null i chcesz, aby ten element lub jeden po nim. Rozważmy ten przykład, w którym czwarty element ma wartość NULL, a chcę mieć piąty element i w związku z tym oczekuję, że zostanie zwrócona „5”:
SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;
R
-
6
Niespodzianka! Zwraca 5. element NON-NULL, a nie faktyczny 5. element! Zwrócone dane są nieprawidłowe i możesz ich nawet nie złapać. Spróbuj zamiast tego:
SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;
R
-
5
Tak więc poprawiony powyżej REGEXP_SUBSTR mówi, aby szukać piątego wystąpienia 0 lub więcej znaków oddzielonych przecinkami, po których następuje przecinek lub koniec wiersza (pozwala na następny separator, czy to przecinek, czy koniec wiersza) i po znalezieniu zwróć pierwszą podgrupę (dane NIE zawierają przecinka ani końca wiersza).
Wzorzec dopasowania wyszukiwania '(.*?)(,|$)'
wyjaśniono:
( = 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
EDYCJA:Dodano więcej informacji i uproszczono wyrażenie regularne.
Zobacz ten post, aby uzyskać więcej informacji i sugestię, aby zawrzeć to w funkcji umożliwiającej łatwe ponowne użycie:REGEX, aby wybrać n-tą wartość z listy, pozwalając na nullsTo jest post, w którym odkryłem format '[^,]+' ma problem. Niestety jest to format wyrażeń regularnych, który najczęściej będziesz widzieć jako odpowiedź na pytania dotyczące przetwarzania listy. Drżę na myśl o wszystkich nieprawidłowych danych zwracanych przez
'[^,]+'
!