sql >> Databáze >  >> RDS >> Oracle

Najít všechny shody ve varchar2()

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.



  1. Jak správně spustit vložení na propojený server SQL?

  2. Oracle:Rozdíl mezi řetězcem NULL a EMPTY

  3. Rozdělit řetězec s novým řádkem a přidat pole v PL sql Oracle

  4. Konfigurace MySQL / CodeIgniter na OpenShift