是否可以搜索表格,但将查询中的字段预格式化为仅匹配数字...例如,我将电话号码存储为(123)555-1234
当有人搜索LIKE '%123555%'
时,它将不会返回,如您所见。
如何编写一个SQL查询来对字段值进行预格式化,然后再搜索...
SELECT * FROM Contacts WHERE FormatFieldHere(phoneNumber) LIKE '%123555%'
答案 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]>