在数据库(用户表)中,我有这种格式的电话号码:
(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/