sql >> Database teknologi >  >> RDS >> Oracle

Find alle match i en varchar2()

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.



  1. mysqli_connect():(HY000/2003):Kan ikke oprette forbindelse til MySQL-server på 'domænenavn' (111)

  2. SQL Server vs. NoSQL

  3. SQL - Call Stored Procedure for hver post

  4. kontrollere, om e-mail findes i MySQL-databasen