我正在研究客户端的遗留系统。电话号码以多种方式存储。例如:
514-879-9989
514.989.2289
5147899287
客户希望能够通过电话号码搜索数据库。
如果不对存储在数据库中的数据进行规范化,如何实现?这可能吗?
我想知道是否有可能有一个看起来像这样的查询:
SELECT FROM table WHERE phonenumber LIKE %input%
但是这只考虑了数据库中的数字字符?
答案 0 :(得分:1)
ViewBDelegate
是的,您可以根据表格中的值添加更多替换,如@ spencer7593所述,例如:
$sql = "SELECT * FROM tab
WHERE replace(replace(phone, '.', ''), '-', '') like '%". $input ."%'"
但我更愿意在查询之前清理数据。
答案 1 :(得分:0)
这是我经常用来清理数据库列的一段代码。我已修改为适合您的目的。
Update Table SET Column =
replace
(replace
(replace(column,
'-','',
'.',''),
' ','')
)
WHERE列不为空
答案 2 :(得分:0)
我将采用的方法(即没有“标准化”值,只有数字可用,并且限制不添加具有标准化值的附加列...)
我会将用户输入用于搜索,并在战略位置添加通配符。例如,如果用户提供 3155551212
的搜索输入,那么我将运行一个具有与此相当的谓词的查询:
phonenumber LIKE '%315%555%1212%'
但如果我不能保证所提供的搜索数字将是一个完整的三位数区域代码,一个三位数的交换(中心局)代码和一个四位数的行号,为了更广泛的搜索,我会添加所有提供的数字之间的外卡,例如
phonenumber LIKE '%3%1%5%5%5%5%1%2%1%2%'
后一种方法不太理想,因为它可能提供比非预期更多的匹配。特别是如果用户提供的数字少于十位。例如,考虑一个phonenumber值:
'+1 (315) 555-7172 ext. 123'
作为示范:
SELECT '+1 (315) 555-7172 ext. 123' LIKE '%3%1%5%5%5%5%1%2%1%2%'
, '+1 (315) 555-7172 ext. 123' LIKE '%315%555%1212%'
MySQL中没有内置字符串函数可以从字符串中提取数字字符。
如果你想要一个能够做到这一点的功能,例如
SELECT only_digits_from('+1 (315) 555-7172 ext. 123')
返回
13155557172123
你必须创建一个存储的函数来做到这一点。我不会尝试在SQL语句中内联它,这需要一个非常冗长和丑陋的表达。