PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara menggabungkan tabel di regex

Seperti yang sudah disebutkan @Milen regexp_matches() mungkin fungsi yang salah untuk tujuan Anda. Anda menginginkan pencocokan ekspresi reguler (~ ) . Sebenarnya, LIKE operator (~~ ) akan lebih cepat :

Mungkin tercepat dengan LIKE

SELECT msg.message
      ,msg.src_addr
      ,msg.dst_addr
      ,mnc.name
FROM   mnc
JOIN   msg ON msg.src_addr ~~ ('%38' || mnc.code || '%')
           OR msg.dst_addr ~~ ('%38' || mnc.code || '%')
WHERE  length(mnc.code) = 3

Selain itu, Anda hanya ingin mnc.code tepat 3 karakter.

Dengan regexp

Anda bisa tulis yang sama dengan ekspresi reguler tetapi pasti akan lebih lambat. Berikut adalah contoh kerja yang mirip dengan aslinya:

SELECT msg.message
      ,msg.src_addr
      ,msg.dst_addr
      ,mnc.name
FROM   mnc
JOIN   msg ON (msg.src_addr || '+' || msg.dst_addr) ~ (38 || mnc.code)
           AND length(mnc.code) = 3

Ini juga memerlukan msg.src_addr dan msg.dst_addr menjadi NOT NULL .

Kueri kedua menunjukkan bagaimana pemeriksaan tambahan length(mnc.code) = 3 bisa masuk ke JOIN kondisi atau WHERE ayat. Efek yang sama di sini.

Dengan regexp_matches()

Anda bisa buat ini berfungsi dengan regexp_matches() :

SELECT msg.message
      ,msg.src_addr
      ,msg.dst_addr
      ,mnc.name
FROM   mnc
JOIN   msg ON EXISTS (
    SELECT * 
    FROM   regexp_matches(msg.src_addr ||'+'|| msg.dst_addr, '38(...)', 'g') x(y)
    WHERE  y[1] = mnc.code
    )

Tapi itu akan lambat dibandingkan - atau begitulah menurut saya.

Penjelasan:
Ekspresi regexp_matches() Anda baru saja mengembalikan larik dari semua substring yang diambil dari pertama cocok. Karena Anda hanya menangkap satu substring (sepasang tanda kurung dalam pola Anda), Anda akan secara eksklusif mendapatkan array dengan satu elemen .

Anda mendapatkan semua kecocokan dengan sakelar "global" tambahan 'g' - tetapi dalam beberapa baris. Jadi, Anda memerlukan sub-pilih untuk menguji semuanya (atau agregat). Masukkan itu ke dalam EXISTS - semi-bergabung dan Anda sampai pada apa yang Anda inginkan.

Mungkin Anda dapat melaporkan kembali dengan pengujian kinerja dari ketiganya? Gunakan MENJELASKAN ANALISIS untuk itu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa pernyataan ActiveRecord ini gagal di Server tetapi tidak di Konsol

  2. Hapus menggunakan CTE lebih lambat daripada menggunakan tabel temp di Postgres

  3. Satu-ke-Banyak-ke-Satu dengan atribut Bentuk dengan Symfony 3 / Doctrine

  4. Hasilkan urutan tanggal yang digunakan dalam for loop

  5. Mengambil baris dari beberapa tabel dengan UNION ALL atau menggunakan satu tabel dalam produksi?