【问题标题】:Search phone numbers in database ignoring special characters在数据库中搜索电话号码忽略特殊字符
【发布时间】:2011-03-23 06:44:33
【问题描述】:

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

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

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

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

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

你能建议我查询这个吗?

【问题讨论】:

  • 对于这个问题从搜索引擎过来的朋友。我最终将按照“lal00”和“Josh”的建议创建一个包含已清理联系人的新列,因为我有很多行,对于当前项目,我必须更喜欢性能改进而不是头痛,但你也可以使用“RLIKE”或 'replace' 如果表中的行数很少,如 'lal00' 和 'Ted Hopp' 所建议的那样。感谢这里的所有天才。

标签: php mysql


【解决方案1】:

您可以在 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]*'

这很糟糕,但它应该可以工作。

【讨论】:

    【解决方案2】:

    方法一:可以在查询中使用replace进行搜索。例如:"Select * from customer where replace(phoneNumber,'-','') = '212-232-3333' 这种方法的缺点是你将无法使用任何索引,搜索会是(非常)慢。

    方法2:在表格的单独列中,还保留没有任何特殊字符的干净版本的电话(人工列-“phoneNumberClean”)。当您更新主列中的记录时,也要更新“干净”列中的记录。

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

    【讨论】:

      【解决方案3】:

      您可以在比较之前清理电话号码:

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

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

      【讨论】:

      • 这个查询对查询执行速度的影响有多大,因为有多个 Lac 行。我在 phoneNumber 字段上有索引
      • 它必须搜索所有字段。这不是最优的。我建议在过滤结果中添加另一列是最佳选择:update mytable set newPhoneColumn = replace(replace(replace(replace(phoneNumber,'('), ')'),' '), '-');
      【解决方案4】:

      基于 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 
      

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

      【讨论】:

        猜你喜欢
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-15
        • 2012-09-22
        • 2018-05-08
        相关资源
        最近更新 更多