将regexp与in、MySQL相结合
是否有任何方法可以与REGEXP结合使用。我有以下代码:将regexp与in、MySQL相结合,mysql,regex,Mysql,Regex,是否有任何方法可以与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
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行,应该每周/每月执行一次
编辑:
下面是一个非常简单的展示方式:
您可以使用重建正则表达式:
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\u CONCAT()
可能不会超过-因此请调整服务器选项或根据它限制输入数据
作为旁注:这样的解决方案是:
- 如果您的字符串包含正则表达式的特殊字符,则将不起作用(例如,在这种情况下,您必须在应用程序中执行转义)
- 完全不可伸缩。如果要搜索10000个子字符串,该怎么办?或者,10.000.000
- 真慢。您将在整个表中逐个执行所有搜索。您可能会在一周时间不足以执行查询的情况下结束
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\u CONCAT()
可能不会超过-因此请调整服务器选项或根据它限制输入数据
作为旁注:这样的解决方案是:
- 如果您的字符串包含正则表达式的特殊字符,则将不起作用(例如,在这种情况下,您必须在应用程序中执行转义)
- 完全不可伸缩。如果要搜索10000个子字符串,该怎么办?或者,10.000.000
- 真慢。您将在整个表中逐个执行所有搜索。您可能会在一周时间不足以执行查询的情况下结束
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\u CONCAT()
可能不会超过-因此请调整服务器选项或根据它限制输入数据
作为旁注:这样的解决方案是:
- 如果您的字符串包含正则表达式的特殊字符,则将不起作用(例如,在这种情况下,您必须在应用程序中执行转义)
- 完全不可伸缩。如果要搜索10000个子字符串,该怎么办?或者,10.000.000
- 真慢。您将在整个表中逐个执行所有搜索。您可能会在一周时间不足以执行查询的情况下结束
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\u CONCAT()
可能不会超过-因此请调整服务器选项或根据它限制输入数据
作为旁注:这样的解决方案是:
- 如果您的字符串包含正则表达式的特殊字符,则将不起作用(例如,在这种情况下,您必须在应用程序中执行转义)
- 完全不可伸缩。如果要搜索10000个子字符串,该怎么办?或者,10.000.000
- 真慢。您将在整个表中逐个执行所有搜索。您可能会在一周时间不足以执行查询的情况下结束
正确的方法:要么在应用程序端实现逻辑,要么使用类似搜索引擎的方法(如果这种搜索是真正的意图,而不是糟糕的应用程序设计的结果)如果您只需要检查字符串的开头,您可以使用类似
的和%
操作符:
SELECT * FROM table_1
WHERE EXISTS
(SELECT * FROM table_2 WHERE table_2.special_name LIKE CONCAT(table_1.name , '%'))
如果只需要检查字符串的开头,可以使用之类的和%
运算符:
SELECT * FROM table_1
WHERE EXISTS
(SELECT * FROM table_2 WHERE table_2.special_name LIKE CONCAT(table_1.name , '%'))
如果只需要检查字符串的开头,可以使用之类的和%
运算符:
SELECT * FROM table_1
WHERE EXISTS
(SELECT * FROM table_2 WHERE table_2.special_name LIKE CONCAT(table_1.name , '%'))
如果只需要检查字符串的开头,可以使用之类的和%
运算符:
SELECT * FROM table_1
WHERE EXISTS
(SELECT * FROM table_2 WHERE table_2.special_name LIKE CONCAT(table_1.name , '%'))
您能提供样本数据吗?我不确定我是否理解设置。您的“姓名结尾”是否遵循某种模式?f、 e.somename\u end1,somename\u end2(我假设名称的结尾类似于“\u someend”,您需要“somename”部分)不,它没有任何不可靠的模式。您能提供示例数据吗?我不确定我是否理解设置。您的“姓名结尾”是否遵循某种模式?f、 e.somename\u end1,somename\u end2(我假设名称的结尾类似于“\u someend”,您需要“somename”部分)不,它没有任何不可靠的模式。您能提供示例数据吗?我不确定我是否理解设置。您的“姓名结尾”是否遵循某种模式?f、 e.somename\u end1,somename\u end2(我假设名称的结尾类似于“\u someend”,您需要“somename”部分)不,它没有任何不可靠的模式。您能提供示例数据吗?我不确定我是否理解设置。您的“姓名结尾”是否遵循某种模式?f、 e.somename\u end1,somename\u end2(我假设名称的结尾类似于“\u someend”,您需要“somename”部分)不,它没有任何不可靠的模式