Uwaga! Wyrażenie regexp_substr formatu '[^,]+'
nie zwróci oczekiwanej wartości, jeśli na liście znajduje się element o wartości NULL i chcesz, aby ten element lub jeden po nim. Rozważmy następujący przykład, w którym 4. elementem jest NULL i chcę 5th Element, a zatem oczekiwać, że „5” do zwrotu:
SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;
R
-
6
niespodzianka! Zwraca 5. element NIE-NULL, a nie faktyczny 5 element! Nieprawidłowe dane zostały zwrócone i może nawet nie można ich złapać. Spróbuj to zamiast:
SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;
R
-
5
Tak, powyżej poprawione REGEXP_SUBSTR mówi szukać 5. występowania 0 lub więcej oddzielonych przecinkami znaków występuje przecinek lub końca linii (pozwala na następny separator, być to przecinek lub koniec linii) i po znalezieniu zwracają pierwszą podgrupę (dane NIE zawierają przecinka ani końca wiersza).
Wzór wyszukiwania mecz '(.*?)(,|$)'
wyjaśnił:
( = 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: Więcej informacji dodanej i uproszczone regex.
Zobacz ten post, aby uzyskać więcej informacji i sugestii do hermetyzacji to w funkcji do łatwego ponownego użycia: REGEX to select nth value from a list, allowing for nulls To post gdzie odkryłem format '[^,]+'
ma problemu. Niestety jest to format regex, który najczęściej jest odpowiedzią na pytania dotyczące analizowania listy. Drżę na myśl o wszystkich błędnych danych zwracanych przez '[^,]+'
!
dlaczego nie używać programu Excel? i skopiuj to z tego miejsca? – lookslikeanevo