Oracle
 sql >> база данни >  >> RDS >> Oracle

Намерете всички съвпадения във varchar2()

Страхотен въпрос! Ето цигулка показващи как да заявите съвпаденията в набор от резултати.

И ето дългото обяснение в случай, че заявката във Fiddle няма смисъл :)

Използвам таблица с име RegEx_Test с колона MyVal . Ето съдържанието на таблицата:

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]

Вашият регулярен израз навсякъде е следният:\[[[:alpha:]][[:digit:]]{1,2}\] . Същото е като в другия отговор, с изключение на POSIX :alpha: и :цифра: индикатори, които са по-безопасни в случай на международни набори от знаци.

Първо, трябва да знаете максималния брой съвпадения на всеки ред. Използвайте REGEXP_COUNT за това:

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

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

Използвайте този максимален брой, за да получите таблица "брояч" (това е SELECT ... FROM DUAL по-долу) и съединете кръстосано таблицата на брояча със заявка, която ще изтегли вашите стойности с помощта на REGEXP_SUBSTR . REGEXP_SUBSTR има параметър "срещане" и ще използва 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

Ето примерно изпълнение спрямо моята таблица (частични резултати):

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

В този момент имате набор от резултати от индивидуални съвпадения, плюс нули, където ред има по-малко от максималните съвпадения. Мачовете все още имат заобикалящите ги скоби. Заобиколете всичко с външна заявка, която ще филтрира нулата и ще премахне скобите, и ще имате своя окончателен списък:

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

Това е заявката, която е във Fiddle и може да се използва в друга заявка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Генериране на макара на базата на условия в Oracle SQL скрипт

  2. Как да проверите версията на доставчика на oracle за ole-db. Доставчик на OraOLEDB.Oracle

  3. използване на тригери за осигуряване на съгласуваност на данните

  4. SSIS не успява да запази пакетите и рестартира Visual Studio

  5. Вмъкнете, ако не съществува Oracle