结合regexp和in,MySQL

时间:2014-08-26 11:50:45

标签: mysql regex

有没有什么方法可以将IN与REGEXP结合起来。我有这段代码:

SELECT * FROM table_1 WHERE `name` IN (SELECT `special_name` FROM table_2)

但现在它表明我的公司在不同部门使用不同的名称末尾(以及不同长度的末尾)。 有没有可能在两个不同的表之间做一些REGEXP?有些像:

SELECT * FROM table_1 WHERE `name` REGEXP (SELECT `special_name` FROM table_2)

感谢您的帮助!

PS:解决方案没有速度限制。每张表约200-400行,每周/每月应执行一次。

编辑: 这是一种非常简单的显示方式: http://sqlfiddle.com/#!2/45d61

2 个答案:

答案 0 :(得分:2)

您可以使用GROUP_CONCAT()重建正则表达式:

SELECT 
  * 
FROM 
  table_1 
WHERE 
  `name` 
  REGEXP 
    (SELECT GROUP_CONCAT(`special_name` SEPARATOR '|') FROM table_2)

这将起作用,例如:

mysql> SELECT 'fooo' REGEXP 'foo|bar';
+-------------------------+
| 'fooo' REGEXP 'foo|bar' |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

但是,这会有限制,因为GROUP_CONCAT()可能不会超过group_concat_max_len - 因此请调整服务器选项或根据它限制输入数据。

作为旁注:这样的解决方案是:

  • 如果您的字符串包含正则表达式的特殊字符,则无效(例如,您必须在应用程序中执行转义)
  • 完全不可扩展。如果你想要搜索10.000个子串怎么办?或者,10.000.000?
  • 真的很慢。您将在所有表格中逐个进行所有搜索。当一周不足以执行查询时,您可能会结束这种情况。

正确的方式:要么在应用程序端实现逻辑,要么使用像sphinx这样的搜索引擎(如果这种搜索真的是意图而不是应用程序设计错误的后果)

答案 1 :(得分:1)

如果您只需要检查字符串的开头,则可以使用LIKE%运算符:

SELECT * FROM table_1 
WHERE EXISTS 
    (SELECT * FROM table_2 WHERE table_2.special_name LIKE CONCAT(table_1.name , '%'))

SQLFiddle