2011-07-26 7 views
2

몇 달 전 나는 아래 질문을했다.mysql 쿼리 및 regexp 문제

My question.

그러나, 나는 문제에 실행했다.

나는이 쿼리를 사용하는 경우 : MAC 주소는 "example_224-06-55"로 해결되면

SELECT MAC, NAME FROM DB.HOST WHERE NAME REGEXP (SELECT CONCAT(LEFT(NAME, LENGTH(NAME)-1), "[0-9]+") FROM DB.HOST WHERE MAC="some mac"); 

을하고 "example_224-06-55-00"그들이라는 DB의 또 다른 요소는있다 이 쿼리의 결과로 둘 다 나타납니다. 나는 단지 "example_224-06-55"가 그 쿼리의 결과로 나타나길 원한다.

이름의 크기는 다양하며 예제는 단지 예일뿐입니다.

정말 힘든 시간을 알기 위해 어떤 도움을 주셔서 감사합니다!

작업 QUERY :

SELECT MAC, NAME FROM DB.HOST WHERE NAME REGEXP (SELECT CONCAT(LEFT(NAME, LENGTH(NAME)-1), "[0-9][[:>:]]") FROM DB.HOST WHERE MAC="some mac"); 

답변

2

는 MySQL은 패턴 [[:>:]]는이 문제를 해결하기 위해 특별한 단어 경계를 지원합니다.

SELECT MAC, NAME FROM DB.HOST 
WHERE NAME REGEXP (
SELECT CONCAT(LEFT(NAME, LENGTH(NAME)-1), '[0-9]+[[:>:]]') 
FROM DB.HOST 
WHERE MAC='some mac' 
); 

http://dev.mysql.com/doc/refman/5.1/en/regexp.html, 경계 패턴이 페이지의 하단에 설명하는 단어를 참조하십시오.

ps : SQL의 문자열 리터럴에 작은 따옴표를 사용합니다. 큰 따옴표는 구분 된 식별자를 나타냅니다.

+0

대단히 감사합니다. 그러나 그것이 작동하려면 "+"를 제거해야했습니다. – prolink007

1

당신이 'XXX-XX-XX'대신 "[0-9]+"의 당신이 "\d\d\d-\d\d-\d\d"

+0

크기는 매번 다를 수 있습니다. 다음 번에 9 일 수도 있고 5 일 수도 있습니다. – prolink007

+0

그런 다음 "example_224-06-55-00"문자열이 사용자의 요구 사항을 충족시키지 못하는 이유를 명확히 설명하십시오. 후행 0에 관한 것입니까? –

+0

"some mac"가 "example_224-06-55"라는 이름으로 해석되고 해당 이름이 DB "example_224-06-55-00"에 존재하기 때문에 둘 다 표시됩니다. 나는 "example_224-06-55"만 나타나기를 원합니다. – prolink007

2

업데이트를 정규 표현식을 사용할 수 같은 숫자로 끝나는 문자열에 대한 패턴을 작성하려면 그게 네가 원하는거야.

SELECT MAC, NAME FROM DB.HOST 
WHERE NAME REGEXP 
    (SELECT CONCAT(LEFT(NAME, LENGTH(NAME)-1), "_[0-9]+-[0-9]+-[0-9]+$") 
    FROM DB.HOST WHERE MAC="some mac"); 
+0

길이가 가변적 일 수 있습니다. 그 예일뿐입니다. 도움을 받으려면 – prolink007

+0

+1! – prolink007