2017-05-10 2 views
0

나는 Coursera의 Duke가 제공하는 MySQL 클래스를 사용하고 있습니다. 2 주 안에 지저분한 데이터에 대한 참조가 있으며 여기에서 내 질문을 할 것이라고 생각했습니다. 내 질문의 범위는 하이픈으로 입력 된 것을 제외하고 인스턴스와 이미 일치하는 테이블 행의 항목을 비교하는 방법입니다. 즉 "골든 리트리버 믹스"는 "골든 리트리버 - 믹스"와 동일한 인스턴스입니다. 그리고 DISTINCT SELECT 문을 실행할 때 두 결과를 모두 가져 오지 못하게합니다. catch는 "골든 리트리버 - 에일 테일 테리어 믹스"항목의 경우처럼 열 필드에서 모든 하이픈을 제거 할 수 없습니다. 이 작업을 수행하는 쿼리는 어떻게 나타 납니까? "골든 리트리버 믹스"와 "골든 리트리버 믹스"를 모두 가져 오는 예제 코드는 아래와 같습니다.하이픈으로 연결된 중복을 제거하기위한 MySQL 쿼리

SELECT DISTINCT breed, 
TRIM(LEADING '-' FROM breed) 
FROM dogs 
ORDER BY (LEADING '-' FROM breed) LIMIT 1000, 1000; 

나는 내가 필요로 생각하고 있어요 IF(REPLACE(breed,'-','') = breed) THEN DELETE breed;

를 말한다/THEN 문은 분명히이 올바른 구문은 내가 무엇을 찾고있는되지 않습니다. 당신은 거의 다

+0

하이픈을 교체 한 후 둘 이상의 동일 항목이있는 경우 - 어떤 변형을 유지 하시겠습니까? – Bridge

답변

0

, 당신이 당신의 select 절에 일반 breed 열을 제거하면됩니다 및 REPLACE()

SELECT DISTINCT REPLACE(breed, '-', ' ') 
FROM dogs 

TRIM(LEADING...)TRIM()을 변경하는 데 필요한 모든 문자열의 시작 부분에 하이픈을 제거 할 것 하지만 표시하고자하는 것은 하이픈을 공백으로 간주하는 breed의 고유 값입니다.

편집

나는 두 문자열이 "골든 리트리버 믹스"와 "골든 리트리버 - 믹스"했다 가정하지만, 한 공간 하이픈 ("골든 Retriever- 믹스") 후 실제로이 있다면, 당신을 귀하의 코멘트에서 해명 한 후 REPLACE(breed, '-', '') 대신

편집 2

을 사용할 수 있습니다, 당신이 필요한 생각은 GROUP BY

입니다
SELECT MIN(breed) 
FROM dogs 
GROUP BY REPLACE(breed, '-', ' ') 

하이픈이있는 문자열은 공백이있는 동일한 문자열보다 값이 더 높다고 간주되므로 둘 다있을 경우 공백이있는 문자열을 반환합니다. 그 중 하나만있는 경우 그대로 반환됩니다.

+0

그래도 하이픈을 출력하고 싶을 때는 하이픈없이 필드 이름을 출력합니다. 하이픈없이 다른 행과 동일한 행만 제거하려고합니다. –

+0

@BrianWiley 주목, 내 대답이 향상되었습니다. –

0

나는 당신이 찾고있는 것이 Levenshtein distance (https://en.wikipedia.org/wiki/Levenshtein_distance)라고 생각합니다. 이 단어는 단어 사이의 차이를 계산합니다. "Test"와 "Test1"을 비교하면 1 자 이상이므로 1이됩니다. 에만 가진 모든 항목을 가져올 수 없습니다 How to add levenshtein function in mysql? 또는 Levenshtein: MySQL + PHP

이에서 제안 된 절차를 사용할 수있는 선도 "-"심지어 맞춤법을 가진 사람을 포함한다. 계산 된 거리만큼 결과 데이터를 필터링 할 수 있습니다.

성능 문제로 인해 이것을 원하지 않는 경우에도 TRIM 또는 REPLACE을 사용하여 기호를 필터링하고 다른 문자열과 비교할 수 있습니다.