在数据库中搜索电话号码忽略特殊字符

时间:2011-03-23 06:44:33

标签: php mysql

我有一个客户数据库表,客户的电话号码存储在名为phoneNumber的字段中。

customerId | customerName | phoneNumber
1               Maulik      0213-383030
2               Maulik1     0-213-383030
3               Maulik2     (0213) 383030

我想搜索拥有相同电话号码的客户。

电话号码可能包含' - ','(',')',空格字符。我想在搜索时忽略除数字之外的所有字符。

如数据库所示,当我想搜索电话号码'0213383030'时,这些所有客户都应该在结果集中。

你能否建议我查询一下。

4 个答案:

答案 0 :(得分:4)

您可以在WHILE子句中使用REGEXP运算符(或其同义词RLIKE)。对于正则表达式,请在要查找的数字的每个数字之间输入[^0-9]*。例如:

SELECT * FROM customers WHERE
  phoneNumber RLIKE
  '[^0-9]*0[^0-9]*2[^0-9]*1[^0-9]*3[^0-9]*3[^0-9]*8[^0-9]*3[^0-9]*0[^0-9]*3[^0-9]*0[^0-9]*'

这很糟糕,但它应该有用。

答案 1 :(得分:2)

您可以在比较之前清理phoneNumber:

select * from table where replace(replace(replace(replace(phoneNumber,'('), ')'),' '), '-') = '0213383030';

相反,我会在包含phoneNumber的表中添加另一列但不包含您不想要的字符,然后使用该列进行比较。

答案 2 :(得分:2)

方法1 :您可以在查询中使用replace进行搜索。例如:“从客户选择*替换(phoneNumber,' - ','')='212-232-3333'此方法的缺点是您将无法使用任何索引,搜索将是(很慢。

方法2 :在表格的单独一栏中,还保留一个没有任何特殊字符的干净版手机(人工栏目 - “phoneNumberClean”)。更新主列中的记录时,也请在“干净”列中更新。

方法3 :第三种方法是创建基于函数的索引,这在Oracle中是可行的。它允许您使用方法1进行搜索,而无需使用方法2的人工列,并且仍然具有快速的索引搜索。但是,如果您使用MySQL,则不能使用此方法,因为MySQL不支持基于函数的索引。那么您最好的选择是使用选项2(人工列),并使用更新触发器。

答案 3 :(得分:1)

基于Ted Hopp answer

用于准备搜索字符串的PHP脚本:

$str = '123-45-67';

// remove all except digits
$maybe_phone = preg_replace("/[^0-9]+/", "", $str);

// split string into array
$digit_arr = str_split($maybe_phone);

// put [^0-9]* around each digit of the number we want to find
$phone_regexp = implode('[^0-9]*', $digit_arr);
$phone_regexp = '[^0-9]*' . $phone_str . '[^0-9]*';  

SQL

SELECT * FROM customers WHERE
  phoneNumber RLIKE $phone_regexp 

适用于保存在数据库中的所有类型的电话号码表格,以及任何类型的搜索字符串。