2010-03-11 178 views
1

我有一个包含全名的字段名称的MySQL数据库。要选择姓氏以特定字母开头的所有人,让我们假设A为这个示例,我使用以下查询:SELECT * FROM db WHERE Name LIKE '% A%'。但是,这也会选择具有以A开头的中间名的用户。是否有更改此查询的方法,以便仅选择以A开头的姓氏?MySQL选择名字以姓氏开头的某个字母

回答

4
SELECT * FROM db WHERE Name REGEX ' A[-[:alnum:]'']*$' 
2

伊格纳西奥的正则表达式的工作原理,是很多更灵活 - 您也可以使用这样的事情,如果正则表达式完全混淆了你:

SELECT * FROM db WHERE LEFT(SUBSTRING_INDEX(Name, ' ', -1), 1) = 'A'

http://dev.mysql.com/doc/refman/5.1/en/string-functions.html

+0

这里可能的缺点是带空格的姓氏,例如。 “范布伦” - 但我想你可能没有一个好方法来区分这种类型的领域中的中间名和姓。 – AvatarKava 2010-03-11 05:51:53

1

最近我有同样的情况。最佳的解决方案是不将名称存储在数据库中作为全名,但是,有时我们无法控制数据并需要解决方案。我结束了使用以下内容:

SELECT * FROM db WHERE Name REGEXP " +[[:<:]]j[-'a-z]{3,}$| +[[:<:]]j[-'a-z]{3,} jr.$| +[[:<:]]j[-'a-z]{3,} sr.$"; 

这将搜索以'J'开头的姓氏。我发现J和S是最困难的,因为数据库中的某些名称最后包含Jr.或Sr.,从而抛出查询。

我不得不提,这是一个非常粗略的解决方案,我可以想到很多情况下它不会工作。它可能很快就会变得很长。它说明带有撇号的带连字符的名字或名字,但没有确切的方法来匹配名字。

正在发生的事情的简要说明:

  • 第一空间确保我们永远不会对匹配的第一个名字。
  • [[:<:]]是单词边界的mysql开头([[:>:]]将匹配单词的结尾)。因此[[:<:]] j匹配以J开头的单词。记住,在匹配字符串时,mysql不区分大小写。
  • $确保它是字符串的末尾,因为我们正在查找姓氏。这给Jr或Jr.以及Sr或Sr带来了问题,所以{3,}确保它比2个字母长,并且[-'a-z]不允许句点。我意识到这将跳过有效的两个字母姓氏,如徐,但我在数据库中有比Xus更多的Jrs。另一种解决方案是将{3,}替换为*。然后返回两个字母名称,但如果Jr错过了它将返回的时间段。
  • 最后,这个表达式与其他两种情况'jr。$'和'sr。$'一起运行,以便当姓氏与正在搜索的字母匹配时返回Jr.和Sr.结果。

也可以添加其他案例,如II或III。

您也可以使用MySQL REGEXP文档作为参考。