Pozor! Výraz regexp_substr ve formátu '[^,]+'
nevrátí očekávanou hodnotu, pokud je v seznamu prvek null a chcete tuto položku nebo jednu za ní. Zvažte tento příklad, kde je 4. prvek NULL a já chci 5. prvek, a proto očekávám, že se vrátí '5':
SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;
R
-
6
Překvapení! Vrací 5. NON-NULL prvek, nikoli skutečný 5. prvek! Vrátila se nesprávná data a možná je ani nezachytíte. Zkuste toto:
SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;
R
-
5
Výše opravený REGEXP_SUBSTR tedy říká, že se má hledat 5. výskyt 0 nebo více znaků oddělených čárkou následovaný čárkou nebo koncem řádku (umožňuje další oddělovač, ať už je to čárka nebo konec řádku) a při nalezení vrátí 1. podskupinu (data NEOBSAHUJÍ čárku ani konec řádku).
Vzor vyhledávání '(.*?)(,|$)'
vysvětlil:
( = 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:Přidáno více informací a zjednodušeno regulární výraz.
Další informace a návrh zapouzdřit to do funkce pro snadné opětovné použití naleznete v tomto příspěvku:REGEX pro výběr n-té hodnoty ze seznamu, což umožňuje nulls Je to příspěvek, kde jsem objevil formát '[^,]+' má problém. Bohužel je to formát regulárního výrazu, který nejčastěji uvidíte jako odpověď na otázky, jak analyzovat seznam. Otřásám se při pomyšlení na všechna nesprávná data, která vrací
'[^,]+'
!