我们在一个查询中有一个巨大的模式匹配(大约 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 是去这里的方式吗?那我就得想出对应的表达式了。
最佳答案
是的,REGEXP
或其替代拼写 RLIKE
:
WHERE value NOT RLIKE 'text|text2|text3|text4|text5'
(除非您明确使用 ^
和 $
,否则正则表达式匹配不会锚定到字符串的末尾,因此您不需要 。* (...).*
.)
您应该对其进行测试,看看它是否实际上比带有LIKE
的版本快。在我要查找四个单词的测试数据库中,LIKE
仍然快得多。它还具有作为 ANSI 标准 SQL 的优势,因此您可以在任何数据库上使用它。
如果这是一个常见的查询,您还应该考虑全文索引。
关于mysql - 在 MySQL 中进行模式匹配的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3573637/