选择field1、field2或field3等于电话号码的位置



我正在看一张有phone1、phone2和mobile的桌子。但是,电话字符串的格式不正确。

电话号码基本上是这样的免费文本:

row1: phone1:19123123123
row2: mobile:+1 912 123 123
row3: phone2:1 912 123 123
row4: mobile:(+1) 912 123 123
row5: phone2:(+1)912-123-123

是否可以编写SQL查询来查找字段phone1、phone2或mobile中的一个是否为+1912123123,但它需要能够匹配这些自由文本示例中的任何一个?感谢

因此,在上面的例子中,它应该返回所有5条记录,如果这些自由文本与该电话号码匹配,并且在3个字段中的一个字段中。

假设列中只有数字和+在电话号码中,则可以使用:

where regexp_replace(col, '[^+0-9]', '') = '+19123123123'

这将删除不是+或数字的所有内容。

您可以使用Regex来识别电话号码模式,也可以删除where子句两侧的所有括号和空格,然后进行比较。

SELECT * FROM T 
WHERE REPLACE(REPLACE(REPLACE(phone1, '(',''),')',''),' ','') = '+19123123123'
OR REPLACE(REPLACE(REPLACE(phone1, '(',''),')',''),' ','') = '19123123123'
OR REPLACE(REPLACE(REPLACE(phone2, '(',''),')',''),' ','') = '+19123123123'
OR REPLACE(REPLACE(REPLACE(phone2, '(',''),')',''),' ','') = '19123123123'
OR REPLACE(REPLACE(REPLACE(mobile, '(',''),')',''),' ','') = '+19123123123'
OR REPLACE(REPLACE(REPLACE(mobile, '(',''),')',''),' ','') = '19123123123'

根据Juergen的建议,您可以剥离所有非数字字符并进行比较。如果你在MySQL 8.0+上,你可以使用以下代码

REGEXP_REPLACE(SUBSTRING_INDEX(column_name, ':', -1),'[^0-9]+',"")

假设:列值总是在mobile/phone/sometext之后用冒号(:(分隔。在这里,它将使用冒号之后的字符串的第二部分,然后去掉非数字字符

最新更新