2008-11-06 7 views
4

(참고 : 이것은 SQL Server가 아닌 MySQL의 SQL 용입니다.)SQL (MySQL) : 문자열의 첫 단어와 일치하는 단어?

"abc def GHI JKL"과 같은 값을 가진 데이터베이스 열이 있습니다. 특정 문자로 시작하는 단어에 대/소문자를 구분하지 않는 테스트를 포함하는 WHERE 절을 작성하려고합니다. 예를 들어,이 예제는 문자 a, c, g, j에 대해 true를 테스트합니다. 그 이유는 각각의 문자로 시작하는 '단어'가 있기 때문입니다. 응용 프로그램은 지정된 문자로 시작하는 단어 만있는 레코드를 찾는 검색을위한 것입니다. 또한이 테이블에 대한 전체 텍스트 인덱스가 없음을 유의하십시오.

답변

5

사용의 정규 표현식 opearator :

SELECT * FROM `articles` WHERE `body` REGEXP '[[:<:]][acgj]' 

그것은 열 몸은 A, C, G, 또는 I (대소 문자 구분)

하지만주의로 시작하는 단어가 포함 된 레코드를 반환 :이 매우 좋지 않다 당신이 무거운 짐을 기대한다면 아이디어 (모든 행을 스캔하는 색인을 사용하지 않는다!)

+0

고마워요! 매력처럼 작동합니다. USE INDEX를 추가했습니다. 전체 테이블을 스캔하는 것보다 전체 인덱스를 스캔하는 것이 더 좋습니다. –

+0

주의 : 멀티 바이트 문자로는 작동하지 않습니다. http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp – ankimal

7

LIKE 조작을 사용할 수있다.

'[acgj]' 

사람 : MyLetterParam 이런 식으로 뭔가 할 수있는 곳

SELECT 
    StringCol 
FROM 
    MyTable 
WHERE 
    ' ' + StringCol LIKE '% ' + MyLetterParam + '%' 

을 : 귀하의 단어가 공백으로 구분 된 경우, 첫 번째 단어를 일치 수있는 기회를 제공하기 위해 문자열의 시작에 공간을 추가 단어 분리 기호로 공간 이상을 찾으면 그 기술을 확장 할 수 있습니다. 다음은 TAB, CR, LF, 스페이스 및 NBSP를 단어 분리 자로 취급합니다.

WHERE 
    ' ' + StringCol LIKE '%['+' '+CHAR(9)+CHAR(10)+CHAR(13)+CHAR(160)+'][acgj]%' 

이 접근 방식은 표준 SQL이라는 좋은 인상을줍니다. 주요 SQL 방언들 간에는 변함없이 작동 할 것입니다.

관련 문제