SQL查询以说明具有中间名的用户

时间:2019-04-08 12:06:45

标签: mysql sql

我有一列“名称”,其中存储了用户的全名(例如:“约翰·伍德”或“约翰·迈克尔·伍德”)。我有一个查询,可以根据用户名来检查该用户在数据库中的存在,例如:

SELECT * FROM users WHERE name LIKE var.name%

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

当搜索键为“约翰·伍德”时,如何修改查询以找到用户“约翰·迈克尔·伍德”?换句话说,如果用户具有中间名,即使他们的中间名未包含在搜索字符串中,他们仍应在数据库中找到。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

Another option is to use a full-text index. If you have a full-text index on your name column, the query below should return both 'John Wood' and 'John Michael Wood':

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

答案 2 :(得分:-1)

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