我有一个包含全名的字段名称的MySQL数据库。要选择姓氏以特定字母开头的所有人,让我们假设A为这个示例,我使用以下查询:SELECT * FROM db WHERE Name LIKE '% A%'
。但是,这也会选择具有以A开头的中间名的用户。是否有更改此查询的方法,以便仅选择以A开头的姓氏?MySQL选择名字以姓氏开头的某个字母
1
A
回答
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
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文档作为参考。
相关问题
- 1. MySQL的:索引名(姓氏,名字)
- 2. 查询以检索姓氏以特定字母开头的所有人
- 3. 缩短全名,所以姓氏只是第一个字母
- 4. ACCESS2010检索名字和姓氏的第一个字母
- 5. 单名文本框中的名字和姓氏的姓氏
- 6. MySQL - 选择不以字母开头的记录?
- 7. MYSQL,如何结合名字的前两个字母和姓氏的前五个字母
- 8. 如果语句比较姓氏是否以字母开头A-L
- 9. 选择mtcars数据集,以字母“M”开头的名称
- 10. 将单个字段分隔成名称,姓氏和姓氏
- 11. MVC User.Identity.Name,姓氏和名字
- 12. 联系人选择器,检索姓氏,名字,电话号码
- 13. 在单独的列中搜索名字或姓氏在MySQL数据库中的名字和姓氏
- 14. 将姓名字段拆分成姓氏和名字
- 15. SQL Server - 在名字和姓氏字段中搜索姓名
- 16. 选择全部位置[第一个字母以B开头]
- 17. 分割名称为名字和姓氏
- 18. SQL中的名字,姓氏太复杂?
- 19. WordPress的获取名字和姓氏
- 20. 发现用户的名字和姓氏?
- 21. 添加用户的姓氏和名字
- 22. 从sql中选择某个列以某个字符串开头的条件
- 23. 连接名字和姓氏形成一个全名字段
- 24. 的Python:打印是开头的所有姓名,并以相同字母
- 25. 复制以某个字母开头的所有文件
- 26. 搜索以字母开头
- 27. 以字母开头的粗体字
- 28. 将名字/姓氏发布到Excel CSV
- 29. NSPredicate检测名字和姓氏
- 30. 为姓氏和名字建立索引
这里可能的缺点是带空格的姓氏,例如。 “范布伦” - 但我想你可能没有一个好方法来区分这种类型的领域中的中间名和姓。 – AvatarKava 2010-03-11 05:51:53