Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Znajdź wszystkie dopasowania w varchar2()

Świetne pytanie! Oto skrzypce pokazuje, jak wyszukiwać dopasowania w zestawie wyników.

A oto długie wyjaśnienie na wypadek, gdyby zapytanie w Fiddle nie miało sensu :)

Używam tabeli o nazwie RegEx_Test z kolumną MyVal . Oto zawartość tabeli:

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]

Twoje wyrażenie regularne jest następujące:\[[[:alpha:]][[:digit:]]{1,2}\] . Jest tak samo jak w drugiej odpowiedzi, z wyjątkiem POSIX :alpha: i :digit: wskaźniki, które są bezpieczniejsze w przypadku znaków międzynarodowych.

Najpierw musisz znać maksymalną liczbę meczów na dowolnej linii. Użyj REGEXP_COUNT w tym celu:

SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
  FROM Regex_Test

MAX(REGEXP_COUNT(My...
----------------------
                     6

Użyj tej maksymalnej liczby, aby uzyskać tabelę „licznik” (jest to SELECT ... FROM DUAL poniżej) i połącz krzyżowo tabelę liczników za pomocą zapytania, które pobierze Twoje wartości za pomocą REGEXP_SUBSTR . REGEXP_SUBSTR ma parametr "occurrence" i będzie używał 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

Oto przykładowy przebieg na mojej tabeli (wyniki częściowe):

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

W tym momencie masz zestaw wyników pojedynczych dopasowań, plus wartości null, w których wiersz miał mniej niż maksymalne dopasowania. Mecze nadal mają swoje otaczające nawiasy. Otocz całość zewnętrznym zapytaniem, które odfiltruje wartości null i usunie nawiasy, a otrzymasz ostateczną listę:

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

To jest zapytanie, które znajduje się na skrzypcach i może być użyte w innym zapytaniu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sql Developer może połączyć Oracle Database 12c z TNS, ale nie może połączyć się z podstawowym

  2. Oracle:Jak używać zmiennych lokalnych procedury dla instrukcji EXECUTE IMMEDIATE w procedurach

  3. Tworzenie sha1-hash rzędu w Oracle

  4. Dlaczego otrzymuję Ora-30004, gdy separator sys_connect_by_path nie jest obecny w wartościach kolumn?

  5. Najważniejsze nowe funkcje Oracle 12c