MySQL在字段上搜索,但删除所有非数字字符

时间:2019-04-08 21:44:17

标签: mysql

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

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

如何编写一个SQL查询来对字段值进行预格式化,然后再搜索...

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

3 个答案:

答案 0 :(得分:3)

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

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

Regexp '[^0-9]'的含义是:除数字外的所有内容。使用此技术,您无需明确列出要忽略的每个字符。

答案 1 :(得分:0)

由于 MySql 中没有正则表达式替换功能,因此,如果您删除电话号码中所有非数字字符多个replace(),则可以执行所需的操作:

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

答案 2 :(得分:0)

另一种方法是创建一个持久虚拟列,在此mysql自动存储标准化的电话号码,如下所示。可以使用GMB描述的功能。

注意:创建虚拟列的功能是针对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
在新的COLUMN上

SELECT

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]>