2010-03-11 3 views
1

전체 이름이 들어있는 Name 필드가있는 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

마지막으로 공백이있는 단점이 있습니다 (예 : "Van Buren"-하지만이 유형의 필드에서 중성과 성을 구별하는 좋은 방법이 없을 것 같습니다. – AvatarKava

1

나는 최근에 같은 상황이 있었다 . 최적의 솔루션은 전체 이름으로 데이터베이스에 이름을 저장하지 않는 것입니다. 그러나 때때로 우리는 데이터를 제어하지 못하고 솔루션이 필요합니다. 나는 다음을 사용하여 끝냈다 :

이것은 'J'로 시작하는 성을 검색 할 것이다. 데이터베이스의 일부 이름에 Jr 또는 Sr이 포함되어 있기 때문에 J와 S가 가장 어려운 것으로 나타났습니다.

나는 이것이 매우 어려운 해결책이라는 것을 언급해야하고, 작동하지 않을 때 나는 많은 경우를 생각할 수있다. 그것은 매우 오래 매우 빠르게 될 수 있습니다. 하이픈이있는 이름이나 아포스트로피가있는 이름을 설명하지만 이름을 일치시키는 확실한 방법은 없습니다.

무슨 일이 일어나고 있는지에 대한 간략한 설명 :

  • 첫 번째 공간은 우리가 결코 이름에 일치하지 않습니다 확인합니다.
  • [[: < :]]는 단어 경계의 시작 부분 인 [[:> :]]은 단어의 끝과 일치합니다. 그래서 [[: < :]] j는 J로 시작하는 단어를 찾습니다. mysql은 문자열을 일치시킬 때 대소 문자를 구별하지 않습니다.
  • $는 성을 찾고 있으므로 문자열의 끝임을 확인합니다. 이는 주니어 또는 주니어와 Sr 또는 Sr.에게 문제가되므로 {3,}은 2 글자보다 길고 마침표를 허용하지 않음을 확인합니다. 나는 이것이 Xu와 같은 유효한 2 글자 성을 건너 뛰는 것을 깨닫는다. 그러나 나는 데이터베이스에 Xus보다 더 많은 Jrs를 가지고있다. 또 다른 해결책은 {3,}을 *로 대체하는 것입니다. 그런 다음 두 개의 문자 이름이 반환되지만 주니어가 마침표를 빠뜨리면 반환됩니다.
  • 마지막으로이 표현식은 'jr. $'와 'sr. $'의 두 가지 다른 경우와 함께 실행되어 성이 검색 할 문자와 일치 할 때 Jr. 및 Sr. 결과가 반환됩니다.

II 또는 III과 같은 추가 사례도 추가 할 수 있습니다.

또한 MySQL REGEXP 설명서를 참조 할 수 있습니다.

관련 문제