2010-08-26 18 views
2

我们在查询中有一个巨大的模式匹配(大约12个字符串检查)。 现在,我必须在MySQL中执行此查询,但似乎来自PostgreSQL的查询具有不同的语法。什么是在MySQL中进行模式匹配的有效方法?

和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去这里的路?然后我必须找出相应的表达式。

回答

2

是,REGEXP或者其替代拼写RLIKE

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

(一个正则表达式匹配不固定字符串的结束,除非你明确地使用^$,所以你不需要.*(...).*。 )

您应该测试它是否是实际上是比使用LIKE的版本更快。在我的测试数据库中找到四个字,LIKE仍然快得多。它还具有ANSI标准SQL的优点,因此您可以在任何数据库上使用它。

如果这是一个常见的查询,您还应该考虑全文索引。

+0

在这种情况下,NOT(LIKE或LIKE或LIKE ...)比NOT RLIKE快50%。 根据支票的数量,这可能会有所不同。 感谢您的所有额外信息! – Smamatti 2010-08-26 12:14:22

相关问题