Запрос, который игнорирует пробелы - PullRequest
29 голосов
/ 26 апреля 2010

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

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

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

John Bob Jones
JohnBob Jones
JohnBobJones

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

Ответы [ 6 ]

59 голосов
/ 26 апреля 2010
SELECT * FROM mytable 
    WHERE REPLACE(username, ' ', '') = REPLACE("John Bob Jones", ' ', '')
11 голосов
/ 26 апреля 2010

Это зависит. Если вы не заботитесь о хорошей производительности, есть много вещей, которые вы могли бы сделать, но большинство из них будут медленными. Может быть, это нормально для вас, но я оставлю этот ответ здесь, если другие читатели захотят быстрого решения.

Если вы хотите очень высокую производительность, вы должны индексировать строку без пробелов в базе данных. В PostgreSQL вы можете создать индекс для функции . Вы можете использовать это, чтобы создать индекс для столбца с пробелами, замененными пустой строкой. Преимущество этого метода в том, что он не требует обслуживания, кроме создания индекса.

В MySQL вы не можете сделать это, поэтому самым простым способом было бы дублировать данные в базе данных - один раз с пробелами и один раз без. Используйте столбец без пробелов в предложении WHERE, но исходный столбец в списке столбцов SELECT. Это требует больше обслуживания, поскольку столбцы должны быть синхронизированы. Вы можете сделать это с помощью логики приложения или триггеров базы данных.

2 голосов
/ 31 января 2016

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

ВЫБРАТЬ * ИЗ mytable ГДЕ имя пользователя, например 'John%' и REPLACE (имя пользователя, '', '') = REPLACE ("Джон Боб Джонс", '', '')

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

ВЫБРАТЬ * ИЗ mytable ГДЕ имя пользователя REGEXP '^ Джон * Боб * Джонс'

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

Взгляните на http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html

1 голос
/ 13 августа 2015

ПОПРОБУЙТЕ:

SELECT * FROM mytable WHERE username =REPLACE("John Bob Jones", ' ', '')
0 голосов
/ 07 января 2018

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

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

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: вот длинный текст с множеством пробелов и различными символами

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

0 голосов
/ 26 апреля 2010

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

ВЫБРАТЬ * ИЗ mytable WHERE Имя пользователя LIKE 'Джон Боб Джонс';

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