【问题标题】:MySQL search on a field but remove all non-numeric charactersMySQL搜索字段但删除所有非数字字符
【发布时间】:2019-04-08 21:44:16
【问题描述】:

是否可以搜索表格但预先格式化查询中的字段以仅匹配数字...例如,我将电话号码存储为 (123) 555-1234

当有人搜索LIKE '%123555%' 时,它不会返回,如您所见。

如何在搜索之前编写一个 sql 查询来预先格式化字段值...

SELECT * FROM Contacts WHERE FormatFieldHere(phoneNumber) LIKE '%123555%'

【问题讨论】:

  • 这在您的用例中可能是不可能的,但是您能否将电话号码存储为不带格式的纯数字字符串,然后在演示之前对其进行格式化?这样一来,您的电话号码就可以使用上面给出的语法进行搜索。
  • stackoverflow.com/a/1794075/2154871 看看这个关于如何拆分用户输入的答案,然后你会用括号和连字符将它拼凑在一起,也就是说我会考虑改变它的存储方式以使其更简单.事实上,改变它的搜索方式,强制用户使用两个字段,你将它们组合成一个格式化的搜索查询比拆分然后格式化要容易得多

标签: mysql sql database string where-clause


【解决方案1】:

在 MySQL 8.0 中,您可以在比较之前使用function REGEXP_REPLACE() 去除所有非数字字符,例如:

SELECT * 
FROM Contacts 
WHERE REGEXP_REPLACE(phoneNumber, '[^0-9]', '') LIKE '%123555%'

正则表达式'[^0-9]' 表示:除了数字之外的所有内容。使用这种技术,您无需明确列出要忽略的每个字符。

【讨论】:

    【解决方案2】:

    由于 MySql 中没有正则表达式替换功能,如果您将电话号码中的所有非数字字符从多个replace() 中删除,您可以做您需要的事情:

    SELECT * FROM Contacts 
    WHERE replace(replace(replace(replace(phoneNumber, '(', ''), ')', ''), '-', ''), ' ', '') LIKE '%123555%'
    

    【讨论】:

      【解决方案3】:

      另一种方法是创建一个持久虚拟列,其中 mysql 自动存储这样的规范化电话号码。可以使用 GMB describe 中的功能。

      注意:创建虚拟列的函数是针对 MariaDB 的,我不确定它是否与 MySQL 中的语法相同

      然后你可以像这样使用你的功能:

      SELECT * FROM Contacts WHERE FormatFieldHere(phoneNumber) LIKE '%123555%'
      

      样本

      创建表格并插入行

      MariaDB [test]> CREATE TABLE `Contacts` (
          ->   `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
          ->   `phoneNumber` varchar(32) DEFAULT NULL,
          ->   PRIMARY KEY (`id`)
          -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
      Query OK, 0 rows affected (0.034 sec)
      
      MariaDB [test]> 
      MariaDB [test]> INSERT INTO `Contacts` (`id`, `phoneNumber`)
          -> VALUES
          -> (1, '(123) 555-1234'),
          -> (2, '+49 2163 9988-111');
      Query OK, 2 rows affected (0.005 sec)
      Records: 2  Duplicates: 0  Warnings: 0
      

      查看行

      MariaDB [test]> SELECT * FROM `Contacts`;
      +----+-------------------+
      | id | phoneNumber       |
      +----+-------------------+
      |  1 | (123) 555-1234    |
      |  2 | +49 2163 9988-111 |
      +----+-------------------+
      2 rows in set (0.000 sec)
      

      添加虚拟列和索引并查看新行

      MariaDB [test]> ALTER TABLE `Contacts`
          -> ADD COLUMN
          -> `phoneNumberN` VARCHAR(32) AS ( REGEXP_REPLACE(`phoneNumber`, '[^0-9]', '') ) PERSISTENT;
      Query OK, 2 rows affected (0.032 sec)              
      Records: 2  Duplicates: 0  Warnings: 0
      
      MariaDB [test]> ALTER TABLE `Contacts`
          -> ADD KEY
          -> `IDX_phoneNumberN` (`phoneNumberN`);
      Query OK, 0 rows affected (0.036 sec)
      Records: 0  Duplicates: 0  Warnings: 0
      
      MariaDB [test]> SELECT * FROM `Contacts`;
      +----+-------------------+---------------+
      | id | phoneNumber       | phoneNumberN  |
      +----+-------------------+---------------+
      |  1 | (123) 555-1234    | 1235551234    |
      |  2 | +49 2163 9988-111 | 4921639988111 |
      +----+-------------------+---------------+
      2 rows in set (0.000 sec)
      

      添加 2 个其他测试行

      MariaDB [test]> INSERT INTO `Contacts` (`id`, `phoneNumber`)
          -> VALUES
          -> (3, '222 (123) 555-1234'),
          -> (4, '222 +49 2163 9988-111');
      Query OK, 2 rows affected (0.029 sec)
      Records: 2  Duplicates: 0  Warnings: 0
      

      在新列上选择

      MariaDB [test]> SELECT * from `Contacts` WHERE `phoneNumberN` LIKE '%123555%';
      +----+--------------------+---------------+
      | id | phoneNumber        | phoneNumberN  |
      +----+--------------------+---------------+
      |  1 | (123) 555-1234     | 1235551234    |
      |  3 | 222 (123) 555-1234 | 2221235551234 |
      +----+--------------------+---------------+
      2 rows in set (0.001 sec)
      
      MariaDB [test]> 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-03
        • 2012-05-10
        • 1970-01-01
        • 2012-07-04
        • 2015-11-07
        相关资源
        最近更新 更多