Skvělá otázka! Tady jsou housle ukazuje, jak dotazovat shody do sady výsledků.
A tady je dlouhé vysvětlení pro případ, že by dotaz v Fiddle nedával smysl :)
Používám tabulku s názvem RegEx_Test
se sloupcem MyVal
. Zde je obsah tabulky:
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]
Váš regulární výraz v celém textu je tento:\[[[:alpha:]][[:digit:]]{1,2}\]
. Je to stejné jako v druhé odpovědi kromě POSIX :alpha:
a :digit:
indikátory, které jsou bezpečnější v případě mezinárodních znakových sad.
Nejprve musíte znát maximální počet shod na libovolném řádku. Použijte REGEXP_COUNT
pro toto:
SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
FROM Regex_Test
MAX(REGEXP_COUNT(My...
----------------------
6
Použijte tento maximální počet k získání "počítačové" tabulky (to je SELECT ... FROM DUAL
níže) a propojte tabulku počítadel pomocí dotazu, který načte vaše hodnoty pomocí REGEXP_SUBSTR
. REGEXP_SUBSTR
má parametr "occurrence" a ten bude používat Counter
:
SELECT
MyVal,
Counter,
REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched
FROM Regex_Test
CROSS JOIN (
SELECT LEVEL Counter
FROM DUAL
CONNECT BY LEVEL <= (
SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
FROM Regex_Test)) Counters
Zde je ukázkový běh proti mé tabulce (částečné výsledky):
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
... and so on - total is 30 rows
V tomto okamžiku máte sadu výsledků jednotlivých zápasů plus nuly, kde řada měla méně než maximální počet shod. Zápasy mají stále své okolní závorky. Obklopte celou věc vnějším dotazem, který odfiltruje nuly a odstraní závorky, a máte konečný seznam:
SELECT SUBSTR(Matched, 2, LENGTH(Matched)-2) FROM (
SELECT
MyVal,
Counter,
REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched
FROM Regex_Test
CROSS JOIN (
SELECT LEVEL Counter
FROM DUAL
CONNECT BY LEVEL <= (
SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
FROM Regex_Test)) Counters
) WHERE Matched IS NOT NULL
Toto je dotaz, který je na Fiddle a lze jej použít v jiném dotazu.