Pas op! De expressie regexp_substr van het formaat '[^,]+'
zal de verwachte waarde niet retourneren als er een null-element in de lijst staat en u dat item of een item daarna wilt. Beschouw dit voorbeeld waarbij het 4e element NULL is en ik het 5e element wil en dus verwacht dat de '5' wordt geretourneerd:
SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;
R
-
6
Verrassing! Het retourneert het 5e NON-NULL element, niet het eigenlijke 5e element! Er zijn onjuiste gegevens geretourneerd en u kunt ze misschien niet eens opvangen. Probeer in plaats daarvan dit:
SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;
R
-
5
Dus, de hierboven gecorrigeerde REGEXP_SUBSTR zegt te zoeken naar het 5e voorkomen van 0 of meer door komma's gescheiden tekens gevolgd door een komma of het einde van de regel (laat het volgende scheidingsteken toe, of het nu een komma is of het einde van de regel) en wanneer gevonden, retourneer de 1e subgroep (de gegevens NIET inclusief de komma of het einde van de regel).
Het zoekpatroon '(.*?)(,|$)'
uitgelegd:
( = 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:Meer info toegevoegd en vereenvoudigde de regex.
Zie dit bericht voor meer info en een suggestie om dit in een functie in te kapselen voor eenvoudig hergebruik:REGEX om de n-de waarde uit een lijst te selecteren, waarbij nulls mogelijk zijn. Het is het bericht waarin ik het formaat ontdekte '[^,]+'
heeft het probleem. Helaas is dit het regex-formaat dat u het meest zult zien als het antwoord op vragen over het ontleden van een lijst. Ik huiver bij de gedachte aan alle onjuiste gegevens die worden geretourneerd door '[^,]+'
!