有没有什么方法可以将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
答案 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
- 因此请调整服务器选项或根据它限制输入数据。
作为旁注:这样的解决方案是:
正确的方式:要么在应用程序端实现逻辑,要么使用像sphinx这样的搜索引擎(如果这种搜索真的是意图而不是应用程序设计错误的后果)
答案 1 :(得分:1)
如果您只需要检查字符串的开头,则可以使用LIKE
和%
运算符:
SELECT * FROM table_1
WHERE EXISTS
(SELECT * FROM table_2 WHERE table_2.special_name LIKE CONCAT(table_1.name , '%'))