我有一个包含全名的字段名称的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. 姓氏,名字开关
- 2. SQL SERVER查询选择名字,姓氏
- 3. 名字和姓氏中的Split姓氏
- 4. MySQL的:索引名(姓氏,名字)
- 5. 开关姓氏,名字姓氏里面名单
- 6. 更改姓氏,名字到姓氏,FirstInitial
- 7. 仅提取姓氏名字,姓氏
- 8. 查询以检索姓氏以特定字母开头的所有人
- 9. 缩短全名,所以姓氏只是第一个字母
- 10. ACCESS2010检索名字和姓氏的第一个字母
- 11. OpsHub - 用户映射 - 名字姓氏vs(Azure)姓氏,名字
- 12. 用名字和姓氏查找姓名
- 13. 单名文本框中的名字和姓氏的姓氏
- 14. MySQL - 选择不以字母开头的记录?
- 15. “姓氏,名字” - >“名字姓氏”中的序列化字符串
- 16. MYSQL,如何结合名字的前两个字母和姓氏的前五个字母
- 17. 如果语句比较姓氏是否以字母开头A-L
- 18. 选择mtcars数据集,以字母“M”开头的名称
- 19. 将单个字段分隔成名称,姓氏和姓氏
- 20. 提取名字和姓氏
- 21. MVC User.Identity.Name,姓氏和名字
- 22. 搜索名字和姓氏
- 23. 名字姓氏验证asp.NET
- 24. 格式化姓氏,名字
- 25. 按字母顺序排列的姓氏
- 26. mysql LIKE只选择第一个字母开头
- 27. Java 8:从可以为空的名字和姓氏构建首字母缩写
- 28. :姓名,姓氏:姓名
- 29. 联系人选择器,检索姓氏,名字,电话号码
- 30. 在单独的列中搜索名字或姓氏在MySQL数据库中的名字和姓氏
这里可能的缺点是带空格的姓氏,例如。 “范布伦” - 但我想你可能没有一个好方法来区分这种类型的领域中的中间名和姓。 – AvatarKava 2010-03-11 05:51:53