将regexp与in、MySQL相结合

将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

是否有任何方法可以与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行,应该每周/每月执行一次

编辑: 下面是一个非常简单的展示方式:

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

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”部分)不,它没有任何不可靠的模式