2010-03-11 175 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文檔作爲參考。