0

我有两个数据库,都包含电话号码。我需要找到所有重复电话号码的实例,但数据库 1 的格式与数据库 2 的格式相差很大。

我想去掉所有非数字字符,然后比较两个 10 位字符串以确定它是否重复,例如:

SELECT b.phone as barPhone, sp.phone as SPPhone FROM bars b JOIN single_platform_bars sp ON sp.phone.REGEX = b.phone.REGEX

在 mysql 查询中甚至可能发生这样的事情吗?如果是这样,我该怎么做呢?

编辑:看起来它实际上是你可以做的事情!万岁!以下查询完全返回了我需要的内容:

SELECT b.phone, b.id, sp.phone, sp.id
FROM bars b JOIN single_platform_bars sp ON REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(b.phone,' ',''),'-',''),'(',''),')',''),'.','') = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(sp.phone,' ',''),'-',''),'(',''),')',''),'.','')
4

2 回答 2

1

MySQL 本身不支持此类字符串操作。您将需要使用这样的 UDF 或者创建一个存储函数,该函数迭代一个字符串参数,该字符串参数连接到它遇到的每个数字的返回值。

于 2012-08-30T18:09:49.390 回答
1

MySQL 不支持返回正则表达式的“匹配”。MySQL REGEXP 函数返回 1 或 0,具体取决于表达式是否匹配正则表达式测试。

您可以使用 REPLACE 函数替换特定字符,并且可以嵌套这些字符。但是对于所有“非数字”字符来说,这将是笨拙的。如果你想删除空格,破折号,打开和关闭括号,例如

REPLACE(REPLACE(REPLACE(REPLACE(sp.phone,' ',''),'-',''),'(',''),')','')

一种方法是创建用户定义的函数以仅返回字符串中的数字。但是,如果您不想创建用户定义的函数...


这可以在本机 MySQL 中完成。这种方法有点笨拙,但对于“合理”长度的字符串是可行的。

SELECT CONCAT(IF(SUBSTR(sp.phone,1,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,1,1),'')
             ,IF(SUBSTR(sp.phone,2,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,2,1),'')
             ,IF(SUBSTR(sp.phone,3,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,3,1),'')
             ,IF(SUBSTR(sp.phone,4,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,4,1),'')
             ,IF(SUBSTR(sp.phone,5,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,5,1),'')
       ) AS phone_digits
  FROM sp

解压一下……我们从字符串的第一个位置提取单个字符,检查它是否是数字,如果是数字,则返回字符,否则返回空字符串。我们对字符串中的第二个、第三个等字符重复此操作。我们将所有返回的字符和空字符串连接成一个字符串。

显然,上面的表达式只检查字符串的前五个字符,你需要扩展它,基本上为你想要检查的每个位置添加一行......

像这样笨拙的表达式可以包含在谓词中(在 WHERE 子句中)。(为方便起见,我刚刚在 SELECT 列表中显示了它。)

于 2012-08-30T19:07:43.197 回答