2010-04-25 3 views
26

Каков наилучший способ запуска запроса, чтобы пробелы в полях игнорировались? Например, следующие запросы:Запрос, игнорирующий пробелы

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

найдет следующие данные:

John Bob Jones 
JohnBob Jones 
JohnBobJones 

Я использую PHP или Python, но я думаю, что это не имеет значения.

+1

PostgreSQL или MySQL? Лучшее решение может быть различным в каждом случае. Попытка написать что-то, что работает в обоих, обычно является рецептом медленного запроса. –

ответ

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

отлично работает в firebird2.5. – lordvlad

+0

Вы также можете использовать функцию REPLACE() с операторами LIKE и подстановочными знаками. Например: SELECT * FROM mytable REPLACE (имя пользователя, '', '') LIKE REPLACE ("John B%", '', ''); –

-1

Один из способов - использовать LIKE и WildCards для создания запроса citeria. Что-то вроде:

SELECT * FROM mytable WHERE 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

TRY ЭТО:

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

Не удалось найти «Джон Боб Джонс» – Alan

2

Предлагаемое решение выглядит очень хорошо, но это ужасно для исполнения, если это возможно, ограничить запрос с чем-то вроде

SELECT * FROM туЬаЫе WHERE имя пользователя, как «Джон % 'и REPLACE (имя пользователя,' ',' ') = REPLACE («John Bob Jones»,' ',' ')

Также вы можете использовать REGEXP.

SELECT * FROM туЬаЫе WHERE 'John * Bob * Джонса^имя пользователя РегВыр

И помните, производительность, работа в где же вообще плохая идея.

Посмотрите http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html

0

Мы часто хотим, чтобы искать текст, независимо от количества пробелов, пробелов и букв.

Просто обрезайте нижний регистр и замените все мультиплеерные символы без слова на одно место.

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

возвращение: здесь длинный текст с большим количеством белых пространств и разного характера чувствительных

мусора в данных и бросовых в запросе, но он по-прежнему считает его правильным.

Смежные вопросы