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

Как да обединявам таблици на regex

Както @Milen вече спомена regexp_matches() вероятно е грешната функция за вашата цел. Искате просто съвпадение на регулярен израз (~ ) . Всъщност операторът LIKE (~~ ) ще бъдепо-бързо :

Привидно най-бързо с 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

Освен това искате само mnc.code от точно 3 знака.

С регулярен израз

Вие можете напишете същото с регулярни изрази, но със сигурност ще бъде по-бавно. Ето работещ пример, близък до вашия оригинал:

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

Това също изисква msg.src_addr и msg.dst_addr да бъде NOT NULL .

Втората заявка демонстрира как допълнителната проверка length(mnc.code) =3 може да влезе в JOIN условие или WHERE клауза. Същият ефект тук.

С regexp_matches()

Вие можете направете това да работи с 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
    )

Но ще бъде бавно в сравнение - или поне така предполагам.

Обяснение:
Вашият израз regexp_matches() просто връща масив от всички уловени поднизове на първия съвпада. Тъй като улавяте само един подниз (една двойка скоби във вашия шаблон), ще получите изключително масиви с един елемент .

Получавате всички съвпадения с допълнителния превключвател "глобално" 'g' - но в няколко реда. Така че имате нужда от подизбор, за да ги тествате всички (или обобщени). Поставете това в EXISTS - полусъединяване и ще стигнете до това, което сте искали.

Може би можете да докладвате с тест за ефективност от трите? Използвайте EXPLAIN ANALYZE за това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Брой редове на Psycopg2 за курсор от страна на сървъра

  2. Преглед на различни възли на спомагателния план в PostgreSQL

  3. Уведомяване от тригер на pglogical репликирана таблица

  4. Добавяне на колона към таблицата със стойност от следващия ред

  5. Условен SQL брой