我有一个客户数据库表,客户的电话号码存储在名为phoneNumber的字段中。
customerId | customerName | phoneNumber
1 Maulik 0213-383030
2 Maulik1 0-213-383030
3 Maulik2 (0213) 383030
我想搜索拥有相同电话号码的客户。
电话号码可能包含' - ','(',')',空格字符。我想在搜索时忽略除数字之外的所有字符。
如数据库所示,当我想搜索电话号码'0213383030'时,这些所有客户都应该在结果集中。
你能否建议我查询一下。
答案 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
适用于保存在数据库中的所有类型的电话号码表格,以及任何类型的搜索字符串。