我们在查询中有一个巨大的模式匹配(大约要检查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%');
REGEXP 是怎样走的?然后我将不得不弄清楚相应的表达方式。
答案 0 :(得分:2)
是,REGEXP
或其替代拼写RLIKE
:
WHERE value NOT RLIKE 'text|text2|text3|text4|text5'
(除非您明确使用^
和$
,否则正则表达式匹配不会锚定到字符串的末尾,因此您不需要.*(...).*
。)
您应该对其进行测试,以确定实际比具有LIKE
的版本更快。在我的测试数据库中找到四个单词,LIKE
仍然要快得多。它还具有ANSI标准SQL的优点,因此您可以在任何数据库上使用它。
如果这是一个常见的查询,您还应该考虑全文索引。