Каков эффективный способ сопоставления с образцом в MySQL? - PullRequest
2 голосов
/ 26 августа 2010

У нас огромное совпадение с шаблоном в запросе (около 12 строк для проверки).Теперь я должен выполнить этот запрос в MySQL, но кажется, что запрос из PostgreSQL имеет не тот же синтаксис.

Из PostgreSQL:

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

Как мне сделать это в MySQL вэффективный способ?Я знаю, что это, вероятно, неэффективно вообще.Каков наиболее эффективный способ сделать это?

Это делает свое дело, но, вероятно, худший запрос, чтобы сделать это:

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%');  

Is REGEXP путь сюда?Тогда мне придется выяснить соответствующее выражение.

1 Ответ

2 голосов
/ 26 августа 2010

Да, REGEXP или его альтернативное написание RLIKE:

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

(соответствие регулярному выражению не привязано к концам строки, если вы явно не используете ^ и $, поэтому вам не нужно .*(...).*.)

Вы должны проверить его, чтобы увидеть, действительно ли он быстрее, чем версия с LIKE. В моей тестовой базе данных с четырьмя словами, LIKE был все еще значительно быстрее. Он также обладает тем преимуществом, что он является стандартом ANSI SQL, поэтому его можно использовать в любой базе данных.

Если это обычный запрос, вам также следует рассмотреть возможность полнотекстовой индексации.

...