Comme @Milen l'a déjà mentionné regexp_matches() est probablement la mauvaise fonction pour votre objectif. Vous voulez une simple correspondance d'expression régulière (~ )
. En fait, l'opérateur LIKE (~~ )
sera plus rapide :
Vraisemblablement le plus rapide avec 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
De plus, vous ne voulez que mnc.code d'exactement 3 caractères.
Avec regexp
Vous pourriez écrivez la même chose avec des expressions régulières mais ce sera certainement plus lent. Voici un exemple de travail proche de votre original :
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
Cela nécessite également msg.src_addr et msg.dst_addr être NOT NULL .
La deuxième requête montre comment la vérification supplémentaire length(mnc.code) = 3 peut aller dans le JOIN condition ou un WHERE clause. Même effet ici.
Avec regexp_matches()
Vous pourriez faire fonctionner cela avec 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
)
Mais ce sera lent en comparaison - du moins je suppose.
Explication :
Votre expression regexp_matches() renvoie simplement un tableau de toutes les sous-chaînes capturées de la première match. Comme vous ne capturez qu'une seule sous-chaîne (une paire de crochets dans votre modèle), vous obtiendrez exclusivement des tableaux avec un élément .
Vous obtenez toutes les correspondances avec le commutateur "globalement" supplémentaire 'g' - mais en plusieurs rangées. Vous avez donc besoin d'une sous-sélection pour les tester tous (ou les agréger). Mettez cela dans un EXISTS - semi-joindre et vous arrivez à ce que vous vouliez.
Peut-être pouvez-vous faire un rapport avec un test de performance des trois ? Utilisez EXPLAIN ANALYZE pour ça.