Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Temukan semua kecocokan di varchar2()

Pertanyaan bagus! Ini adalah Biola menunjukkan cara mengkueri kecocokan ke dalam kumpulan hasil.

Dan inilah penjelasan panjangnya jika kueri di Fiddle tidak masuk akal :)

Saya menggunakan tabel bernama RegEx_Test dengan kolom MyVal . Berikut isi tabelnya:

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]

Regexp Anda secara keseluruhan adalah ini:\[[[:alpha:]][[:digit:]]{1,2}\] . Itu sama seperti pada jawaban lain kecuali dengan POSIX :alpha: dan :digit: indikator, yang lebih aman untuk rangkaian karakter internasional.

Pertama, Anda perlu mengetahui jumlah maksimum kecocokan di baris mana pun. Gunakan REGEXP_COUNT untuk ini:

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

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

Gunakan jumlah maksimum itu untuk mendapatkan tabel "penghitung" (itulah SELECT ... FROM DUAL di bawah) dan gabungkan silang tabel penghitung dengan kueri yang akan menarik nilai Anda menggunakan REGEXP_SUBSTR . REGEXP_SUBSTR memiliki parameter "kejadian" dan itu akan menggunakan 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

Berikut ini contoh yang dijalankan terhadap tabel saya (hasil sebagian):

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

Pada titik ini Anda memiliki serangkaian hasil kecocokan individual, ditambah nol di mana satu baris memiliki kecocokan kurang dari maksimum. Pertandingan masih memiliki tanda kurung di sekitarnya. Kelilingi semuanya dengan kueri luar yang akan menyaring nol dan menghapus tanda kurung, dan Anda memiliki daftar akhir:

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

Ini adalah kueri yang ada di Fiddle, dan dapat digunakan di kueri lain.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Disebabkan oleh:java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver

  2. EF 4, cara menambahkan kelas parsial

  3. memuat beberapa csv ke dalam satu tabel dengan SQLLDR

  4. Instrumentasi:Casting org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper ke oracle.jdbc.OracleConnection

  5. Pemicu Mutasi Oracle