Godt spørgsmål! Her er en violin viser, hvordan man forespørger kampene ind i et resultatsæt.
Og her er den lange forklaring, hvis forespørgslen i Violinen ikke giver mening :)
Jeg bruger en tabel med navnet RegEx_Test
med en kolonne MyVal
. Her er tabellens indhold:
MyVal--------------------------------------[A1][abc][B23][D123]a33 [bx5][Z15][ax0][B0][F13]R3[X215][A3A][J99]F33F33G24[43][R3][Z99][c1][F3][d33]3x24[Y3][f13 ][9a][D41][Q39][XX12]B27[T03][J12]
Dit regexp hele vejen igennem er dette:\[[[:alpha:]][[:digit:]]{1,2}\]
. Det er det samme som i det andet svar undtagen med POSIX :alpha:
og :digit:
indikatorer, som er sikrere i tilfælde af internationale tegnsæt.
Først skal du kende det maksimale antal kampe på en linje. Brug REGEXP_COUNT
til dette:
SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]')) FROM Regex_TestMAX(REGEXP_COUNT(Min...- -------------------- 6
Brug det maksimale antal for at få en "tæller"-tabel (det er SELECT ... FROM DUAL
nedenfor) og krydsforbind tællertabellen med en forespørgsel, der vil trække dine værdier ved hjælp af REGEXP_SUBSTR
. REGEXP_SUBSTR
har en "forekomst"-parameter, og som vil bruge Tæller
:
SELECT MyVal, Counter, REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) MatchedFROM Regex_TestCROSS JOIN ( SELECT LEVEL tæller FRA DOBBELT FORBINDELSE EFTER NIVEAU <=( SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]')) FROM Regex_Test)) Tællere
Her er en prøvekørsel mod min tabel (delvise resultater):
MyVal Counter Matched----------------------------------------- ------- -------[9a][D41][Q39][XX12]B27[T03][J12] 1 [D41][9a][D41][Q39][XX12]B27[T03][J12] 2 [Q39][9a][D41][Q39][XX12]B27[T03][J12] 3 [T03][9a][D41][Q39][XX12]B27[T03][J12] 4 [J12][ 9a][D41][Q39][XX12]B27[T03][J12] 5[9a][D41][Q39][XX12]B27[T03][J12] 6[A1][abc][B23][D123 ]a33[bx5] 1 [A1][A1][abc][B23][D123]a33[bx5] 2 [B23][A1][abc][B23][D123]a33[bx5] 3... og så videre - i alt er 30 rækker
På dette tidspunkt har du et resultatsæt af individuelle kampe, plus nuller, hvor en række havde mindre end det maksimale match. Kampene har stadig deres omgivende parentes. Omring det hele med en ydre forespørgsel, der vil bortfiltrere nullerne og fjerne parenteserne, og du har din endelige liste:
SELECT SUBSTR(Matched, 2, LENGTH(Matched)-2) FROM ( SELECT MyVal, Counter, REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1 ,2}\]', 1, tæller) Matchet FRA Regex_Test CROSS JOIN ( SELECT LEVEL Counter FRA DUAL CONNECT BY LEVEL <=( SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]')) FRA Regex_Test)) Tællere) HVOR Matchet IKKE ER NULL
Dette er den forespørgsel, der er på Fiddle, og den kan bruges i en anden forespørgsel.