SQL查询以考虑具有中间名的用户

问题描述 投票:1回答:3

我有一个名为“name”的列,其中我存储了用户的全名(例如:“John Wood”或“John Michael Wood”)。我有一个查询,根据其名称检查数据库中是否存在此用户,例如:

SELECT * FROM users WHERE name LIKE var.name%

其中“var.name”是用户在数据库中查找此其他用户的输入。如果要查找的用户名为“John Wood”,一切正常,但如果用户有一个中间名“John Michael Wood”,如果字符串“John Wood”是,则查询将找不到用户搜索键。

当搜索键为“John Wood”时,如何修改查询以查找用户“John Michael Wood”?换句话说,如果用户具有中间名,即使其中间名未包含在搜索字符串中,仍应在数据库中找到它们。

mysql sql
3个回答
1
投票

您可以使用正则表达式来解决此问题,使用搜索空格后跟可选中间名(一组字母字符)和另一个空格的内容替换名字和姓氏之间的空格。例如:

SELECT *
FROM users
WHERE name REGEXP CONCAT('^', REPLACE('John Wood', ' ', ' ([[:alpha:]]+ )?'), '$')

Demo on dbfiddle

create table users (id int auto_increment primary key,
                    name varchar(40));
insert into users (name) values
('John Wood'),
('Johnny Wood'),
('John Woodman'),
('John Michael Wood'),
('Michael Wood'),
('John Smith');

输出:

id  name
1   John Wood
4   John Michael Wood

0
投票

另一种选择是使用全文索引。如果name列上有全文索引,则下面的查询应返回'John Wood''John Michael Wood'

SELECT * FROM users
WHERE MATCH(`name`) AGAINST ('John Wood' IN NATURAL LANGUAGE MODE)

-1
投票

你应该尝试这个查询:SELECT * FROM users WHERE name LIKE '%var.name%' 现在,当您搜索John时,将返回名称字符串中任何实例的所有具有john的名称

© www.soinside.com 2019 - 2024. All rights reserved.