Подтвердить что ты не робот

Запрос, игнорирующий пробелы

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

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

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

John Bob Jones
JohnBob Jones
JohnBobJones

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

SELECT * FROM mytable   WHERE имя пользователя, например "John%" и REPLACE (имя пользователя, '', '') = REPLACE ( "John Bob Jones", '', '')

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

SELECT * FROM mytable   WHERE имя пользователя REGEXP '^ John * Bob * Jones'

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

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

Ответ 4

ПОПРОБУЙТЕ ЭТО:

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

Ответ 5

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

SELECT * FROM mytable WHERE имя пользователя LIKE 'JohnBobJones';