programing

공백을 무시하는 쿼리

padding 2023. 10. 15. 17:04
반응형

공백을 무시하는 쿼리

필드의 공백이 무시되도록 쿼리를 실행하는 가장 좋은 방법은 무엇입니까?예를 들어 다음과 같은 쿼리가 있습니다.

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

는 다음 항목을 찾을 수 있습니다.

John Bob Jones
JohnBob Jones
JohnBobJones

저는 php나 python을 사용하고 있지만 이것은 중요하지 않다고 생각합니다.

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

사정에 따라 다르겠지.좋은 성적에 연연하지 않는다면 할 수 있는 일은 많지만 대부분은 느릴 것입니다.아마 괜찮을지 모르지만, 다른 사람들이 빠른 해결책을 원할 경우를 대비해서 이 답을 여기에 남겨두겠습니다.

매우 빠른 성능을 원하는 경우 데이터베이스에 공백 없이 문자열을 인덱싱해야 합니다.포스트그레에서SQL 함수에 인덱스를 만들 수 있습니다.이를 사용하여 공백이 빈 문자열로 대체된 열에 색인을 작성할 수 있습니다.이 방법의 장점은 인덱스를 만드는 것과 별도로 유지보수가 필요하지 않다는 것입니다.

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

제안된 솔루션은 매우 좋아 보이지만 다음과 같은 것으로 쿼리를 제한할 수 있는 경우 성능에 좋지 않습니다.

SELECT * FROM mytable 
    WHERE username like 'John%' and REPLACE(username, ' ', '') = REPLACE("John Bob Jones", ' ', '')

REGEXP를 사용할 수도 있습니다.

SELECT * FROM mytable 
    WHERE username REGEXP '^John *Bob *Jones'

일반적으로 좋지 않은 생각을 가지고 있는 곳에서의 성능과 운영을 기억해야 합니다.

http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html 을 확인해 보십시오.

시도해 보기:

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

공백, 공백 및 문자 수에 관계없이 텍스트를 검색하는 경우가 많습니다.

한 칸에 대해 모든 다중 접이식 Non-word 문자를 다듬고 소문자를 내리고 바꾸기만 하면 됩니다.

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

return : 여기에 많은 공백과 다양한 문자가 포함된 긴 텍스트가 있습니다.

검색 용도는 다음과 같습니다.단어의 순서만 중요할 뿐 그 이상은 아닙니다.그리고 이것은 아름답습니다.

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')

return:여기에는 많은 공백과 다양한 문자가 포함된 긴 텍스트가 있습니다.

데이터에 쓰레기가 들어있고 쿼리에 쓰레기가 들어있지만 여전히 올바르게 검색됩니다.

한 가지 방법은 LIKE 및 WildCards를 사용하여 쿼리 기준을 구축하는 것입니다.다음과 같은 경우:

선택 * 내 테이블에서 'JohnBobJones'와 같은 사용자 이름을 선택합니다;

언급URL : https://stackoverflow.com/questions/2709929/query-that-ignore-the-spaces

반응형