使用REGEXP进行'高级'Mysql查询

时间:2015-12-30 12:47:13

标签: mysql regex

我有两个关系表,t1call_number列,t2phone_number

示例表:

+----+-------------+
| id | call_number |
+----+-------------+
| 1  | 36202665476 |
+----+-------------+

+----+-----------------+
| id |   phone_number  |
+----+-----------------+
| 1  | +36 20 266-5476 |
+----+-----------------+

我必须编写一个查询,使用regexp返回这两个“匹配”行,而不对数据库进行任何修改。

SELECT t1.*,t2.* 
FROM t1,t2 
WHERE 
t1.call_number REGEXP concat( t2.phone_number, '[^0-9]')    

因此,在查询中,我必须删除不必要的字符(来自t2.phone_number)然后将“修剪”列与t1.call_number进行比较以找到匹配项。

任何建议都派上用场。

由于

4 个答案:

答案 0 :(得分:2)

您可以在连接条件中替换剩余字符,如下所示:

select *
from t1 
join t2 
  on t1.call_number = replace(replace(replace(t2.phone_number, ' ',''), '-',''),'+','') 

当然,您必须提前知道并说明应删除的所有字符。

Sample SQL Fiddle

显示匹配的示例结果:

| id | call_number | id |    phone_number |
|----|-------------|----|-----------------|
|  1 | 36202665476 |  1 | +36 20 266-5476 |

答案 1 :(得分:1)

然后执行此查询以获取具有匹配值的数字:

SELECT t1.*
FROM `t1`,`t2`
WHERE t1.`call_number` REGEXP REPLACE(REPLACE(REPLACE(t2.`phone_number`, ' ', ''),'-', ''),'+', '');

答案 2 :(得分:1)

REPLACE的参数中调用CONCAT以删除特殊字符。

WHERE t1.call_number REGEXP CONCAT(REPLACE(REPLACE(REPLACE(t2.phone_number, ' ', ''),'-', ''),'+', ''), '[^0-9]')

请注意,连接[^0-9]意味着它只会找到匹配数字后跟非数字字符的匹配项。因此它与您展示的两个示例行不匹配,因为call_number之后没有任何内容。

答案 3 :(得分:0)

如果您的MySQL / MariaDB不是旧版

,您可以使用REGEXP_REPLACE
MariaDB > SELECT REGEXP_REPLACE('ab12cd','[^0-9]','') AS only_digits;
+-------------+
| only_digits |
+-------------+
| 12          |
+-------------+
1 row in set (0.00 sec)