2010-04-25 6 views
26

필드의 공백이 무시되도록 쿼리를 실행하는 가장 좋은 방법은 무엇입니까? 예를 들어, 다음 쿼리 : 나는 PHP 나 Python을 사용하고공백을 무시하는 쿼리

John Bob Jones 
JohnBob Jones 
JohnBobJones 

하지만이 문제가되지 않습니다 생각 :

SELECT * FROM mytable WHERE username = "JohnBobJones"  
SELECT * FROM mytable WHERE username = "John Bob Jones" 

는 다음과 같은 항목을 찾을 것입니다.

+1

PostgreSQL 또는 MySQL? 가장 좋은 해결책은 각 경우마다 다를 수 있습니다. 두 가지 모두에서 작동하는 무언가를 쓰려고하면 대개 느린 쿼리의 방법이됩니다. –

답변

54
SELECT * FROM mytable 
    WHERE REPLACE(username, ' ', '') = REPLACE("John Bob Jones", ' ', '') 
+0

도 파이어 버드 2.5에서 완벽하게 작동합니다. – lordvlad

+0

LIKE 연산자 및 와일드 카드와 함께 REPLACE() 함수를 사용할 수도 있습니다. 예를 들면 다음과 같습니다. SELECT * FROM mytable REPLACE (username, '', '') LIKE REPLACE ("John B %", '', ''); –

-1

LIKE 및 WildCards를 사용하여 검색어 citeria를 만드는 것이 한 가지 방법입니다. 같은 것 :

SELECT * FROM mytable 여기서 username 'LIKE'John Bob Jones ';

+15

'John Paul Bob Jones'와 (과) 일치하지 않습니다. – SLaks

+0

이 대답은 잘못되었습니다. –

10

다릅니다. 좋은 성능에 관심이 없다면 할 수있는 일이 많지만 대부분 느려질 것입니다. 어쩌면 괜찮 겠지 만, 다른 사람들이 읽는 것이 빠른 해결책을 원한다면이 답을 남겨 둘 것입니다.

매우 빠른 성능을 원한다면 데이터베이스에 공백없이 문자열을 인덱싱해야합니다. PostgreSQL에서는 create an index on a function을 사용할 수 있습니다. 이를 사용하여 공백이 빈 문자열로 바뀌면 열에 색인을 만들 수 있습니다. 이 방법의 장점은 인덱스를 만드는 것 외에는 유지 관리가 필요 없다는 것입니다.

MySQL에서는이 작업을 수행 할 수 없으므로 가장 간단한 방법은 데이터베이스에있는 데이터를 복제하는 것입니다. 한 번은 공백으로, 한 번만 사용하십시오. WHERE 절에는 공백없이 열을 사용하고 SELECT 열 목록에는 원래 열을 사용하십시오. 열을 동기화 상태로 유지해야하므로 유지 관리가 더 많이 필요합니다. 응용 프로그램 논리 또는 데이터베이스 트리거로이를 수행 할 수 있습니다.

+0

좋은 지적으로, 나는 방금 우편 번호 검색 및 와우에서 mySQL REPLACE를 시도했습니다 ... 그것은 느립니다 ... 팁 주셔서 감사합니다! – Ford

1

는이 시도 :

SELECT * FROM mytable WHERE username =REPLACE("John Bob Jones", ' ', '') 
+0

'JohnBob Jones'를 찾지 못했을까요? – Alan

2

는 제안 된 솔루션은 잘 보이지만 MYTABLE FROM

SELECT * 같은 뭔가 쿼리를 제한 할 수있는 경우, 성능에 대한 끔찍한입니다 존 '과 같은 이름 REPLACE ("John Bob Jones", '', '')

또한 REGEXP를 사용할 수 있습니다. 를 Where에서 사용자 이름 REGEXP '^ 존 * 밥 * 존스'

그리고 성능을 기억하고, 작업이 일반적으로 나쁜 생각에 MYTABLE FROM

SELECT *.

우리는 종종 관계없이 공간, 공백 및 문자의 수, 텍스트를 검색 할 http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html

0

을 살펴 보자.

하나의 공백에 대해 multipe 비 단어 문자를 모두 자르고 대문자로 바꾸기 만하면됩니다.

SELECT regexp_replace(trim(lower('Here is    a   long    text    , with   many     white spaces   AND    different     character    sensitive')),'\W+',' ','g') t 

반환 : 여기 여기 검색을위한 사용이다

에 민감한 많은 공백 및 다른 문자와 긴 텍스트입니다. 말의 순서 만 중요하고, 그 이상은 없습니다. 그리고 이것은 아름답습니다.

select * from (
SELECT regexp_replace(trim(lower('Here is    a   long    text    , with   many     white spaces   AND    different     character    sensitive')),'\W+',' ','g') t 
) as o 
where t= regexp_replace(trim(lower('Here is a LonG  TEXT , with   mANY white ^ spaces   AND   different character    sensiTive')),'\W+',' ','g') 

반환 : 여기에 쿼리에 민감한 많은 공백 및 다른 문자

데이터 쓰레기와 쓰레기와 긴 텍스트이지만, 여전히 그것을 잘 찾아 낸다.

관련 문제