2010-08-26 13 views
2

Nous avons un énorme motif dans une requête (environ 12 chaînes à vérifier). Maintenant, je dois faire cette requête dans MySQL, mais il semble que la requête de PostgreSQL n'a pas la même syntaxe.Qu'est-ce qu'un moyen efficace de faire correspondre les modèles dans MySQL?

De PostgreSQL:

SELECT value 
FROM ... 
WHERE ... 
AND `value` !~* '.*(text|text2|text3|text4|text5).*'; 

Comment puis-je faire cela en MySQL de manière efficace? Je sais que ce n'est probablement pas efficace du tout. Quel est le moyen le plus efficace de le faire?

Cela ne l'affaire, mais est probablement la pire requête possible de le faire:

SELECT `value` 
FROM ... 
WHERE ... 

AND NOT ( 
    `value` LIKE '%text%' 
OR `value` LIKE '%text2%' 
OR `value` LIKE '%text3%' 
OR `value` LIKE '%text4%' 
OR `value` LIKE '%text5%'); 

est REGEXP la voie à suivre ici? Ensuite, je vais devoir comprendre l'expression correspondante.

Répondre

2

Oui, REGEXP ou son orthographe alternative RLIKE:

WHERE value NOT RLIKE 'text|text2|text3|text4|text5' 

(un match regexp est pas ancré aux extrémités de la chaîne sauf si vous utilisez explicitement ^ et $, de sorte que vous n'avez pas besoin .*(...).*.

Vous devriez le tester pour voir si c'est réellement plus vite que la version avec LIKE. Sur ma base de données de test avec quatre mots à trouver, LIKE était encore considérablement plus rapide. Il a aussi l'avantage d'être un standard SQL ANSI donc vous pouvez l'utiliser sur n'importe quelle base de données.

S'il s'agit d'une requête courante, vous devriez également envisager l'indexation de texte intégral.

+0

Dans ce cas, PAS (SIMILAIRE OU SIMILAIRE OU SIMILAIRE ...) est environ 50% plus rapide que NOT RLIKE. Cela peut varier en fonction du nombre de contrôles. Merci pour toute nouvelle information! – Smamatti