mysql - 如何在 MySql 或 PostgreSql 中搜索电话号码,忽略破折号、括号和空格?

标签 mysql sql postgresql

在数据库(用户表)中,我有这种格式的电话号码:

(619) 745-0863
(619) 745-0864
(619) 745-0865

我想按电话号码搜索,忽略空格、破折号和括号,这意味着如果我按“6197450863”搜索,我希望结果第一行的电话号码为“(619) 745-0863”。

我有有效的代码:

SELECT * FROM users where 
REPLACE(REPLACE(REPLACE(REPLACE(phone, '-', ''), ')', ''), '(', ''), ' ', '') 
LIKE '6197450863'

但这很慢而且很笨拙。有什么办法可以做得更好吗?我目前使用 MySQL,但如果有更好的方法,我会切换到 PostgreSQL。

我知道我可以使用像 Elastic Search 这样的搜索引擎来实现这一点,而且我知道有人会告诉我使用 Elastic Search 即使我明确地说这个问题是关于如何使用 mysql 或 postgreSql 来实现的:) 如果没有更好的办法就直说吧,别说用Elasticsearch之类的。

这个问题其实是关于如何在RDBMS中使用全文搜索而不是替换文本。

最佳答案

在 Postgres 中,最有效的方法可能是使用 translate().

with users(phone) as (
values
    ('(619) 745-0863'),
    ('(619) 745-0864'),
    ('(619) 745-0865')
)
select *
from users
where translate(phone, '() -', '') = '6197450863'

     phone      
----------------
 (619) 745-0863
(1 row)

关于mysql - 如何在 MySql 或 PostgreSql 中搜索电话号码,忽略破折号、括号和空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47325227/

相关文章:

sql - 使用触发器记录更新行的时间是个好主意吗?

sql - 如何生成 sysdate-30 和 sysdate+30 之间的所有日期列表?

sql - 优化分组最大查询

sql - 在数据库 : relational or multidimensional? 中存储多维数组

mysql - 上一年每个用户每月的平均帖子- MYSQL

mysql - 由于在 MySQL 中使用保留字作为表名或列名而导致的语法错误

MySQL聚合问题

MySQL:使用 Group By 更新字段

c# - 如何根据组合框中的选定值从数据库中检索数据?

postgresql - Postgres 和 Sequelize 的 Heroku 部署问题