我有两个关系表,t1
有call_number
列,t2
有phone_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
进行比较以找到匹配项。
任何建议都派上用场。
由于
答案 0 :(得分:2)
您可以在连接条件中替换剩余字符,如下所示:
select *
from t1
join t2
on t1.call_number = replace(replace(replace(t2.phone_number, ' ',''), '-',''),'+','')
当然,您必须提前知道并说明应删除的所有字符。
显示匹配的示例结果:
| 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_REPLACEMariaDB > SELECT REGEXP_REPLACE('ab12cd','[^0-9]','') AS only_digits;
+-------------+
| only_digits |
+-------------+
| 12 |
+-------------+
1 row in set (0.00 sec)