MySQL选择姓氏以特定字母开头的名称

时间:2010-03-11 05:39:43

标签: mysql

我有一个MySQL数据库,其字段名称包含全名。要选择姓氏以特定字母开头的所有人,请为此示例说明A,我使用以下查询:SELECT * FROM db WHERE Name LIKE '% A%'。但是,这也会选择具有以A开头的中间名的用户。无论如何都要更改此查询,以便只选择以A开头的姓氏?

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

Ignacio的正则表达式非常灵活 - 如果正则表达式完全让你感到困惑,你也可以使用类似的东西:

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

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

答案 2 :(得分: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.抛弃了查询。

我必须提到这是一个非常粗略的解决方案,我可以想到许多不合作的情况。它可以很快很长。它使用带有撇号的带连字符的名称或名称进行说明,但是没有可靠的方法来匹配名称。

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

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

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

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

答案 3 :(得分:0)

SELECT * FROM db WHERE Name REGEXP '^A'也可以!