gpt4 book ai didi

mysql - 使用 REGEX 更改 mysql 查询中的字段数据

转载 作者:行者123 更新时间:2023-11-29 08:47:26 25 4
gpt4 key购买 nike

我有两个数据库,都包含电话号码。我需要查找重复电话号码的所有实例,但数据库 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,' ',''),'-',''),'(',''),')',''),'.','')

最佳答案

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

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

REPLACE(REPLACE(REPLACE(REPLACE(sp.phone,' ',''),'-',''),'(',''),')','')
<小时/>

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

<小时/>

这可以在 native 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 列表中。)

关于mysql - 使用 REGEX 更改 mysql 查询中的字段数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12202707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com