web-dev-qa-db-fra.com

Requête qui ignore les espaces

Quelle est la meilleure façon d'exécuter une requête afin que les espaces dans les champs soient ignorés? Par exemple, les requêtes suivantes:

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

trouverait les entrées suivantes:

John Bob Jones
JohnBob Jones
JohnBobJones

J'utilise php ou python mais je pense que cela n'a pas d'importance.

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

Ça dépend. Si vous ne vous souciez pas des bonnes performances, vous pouvez faire beaucoup de choses, mais la plupart d'entre elles seront lentes. Peut-être que ça vous va, mais je vais laisser cette réponse ici au cas où d'autres lecteurs voudraient une solution rapide.

Si vous voulez des performances très rapides, vous devez indexer la chaîne sans espaces dans la base de données. Dans PostgreSQL, vous pouvez créer un index sur une fonction . Vous pouvez l'utiliser pour créer un index sur la colonne avec des espaces remplacés par la chaîne vide. L'avantage de cette méthode est qu'elle ne nécessite aucune maintenance en dehors de la création de l'index.

Dans MySQL, vous ne pouvez pas le faire. La méthode la plus simple consiste à dupliquer les données de la base de données, une fois avec des espaces et une fois sans. Utilisez la colonne sans espaces dans votre clause WHERE, mais la colonne d'origine dans votre liste de colonnes SELECT. Cela nécessite plus de maintenance car les colonnes doivent être synchronisées. Vous pouvez le faire avec une logique d'application ou des déclencheurs de base de données.

10
Mark Byers

La solution proposée est très esthétique, mais les performances sont horribles. Si possible, limitez la requête à quelque chose comme: 

SELECT * FROM mytable WHERE nom d'utilisateur tel que 'John%' et REPLACE (nom d'utilisateur, '', '') = REPLACE ("John Bob Jones", '', '')

Aussi, vous pouvez utiliser REGEXP.

SELECT * FROM mytable Nom d'utilisateur REGEXP '^ John * Bob * Jones'

Et rappelez-vous la performance, le fonctionnement dans le où sont en général une mauvaise idée.

Jetez un coup d’œil à http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html

2
Mquinteiro

ESSAYE ÇA:

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

Nous souhaitons souvent rechercher du texte, quel que soit le nombre d'espaces, d'espaces ou de lettres.

Il suffit de couper, mettre en minuscules et remplacer tous les caractères multipe non-Word d'un espace 

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

return: Voici un long texte avec de nombreux espaces et des caractères différents

Voici l'utilisation pour la recherche. Seul l'ordre des mots est important, rien de plus. Et c'est magnifique.

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: Voici un long texte avec de nombreux espaces et des caractères différents

Des ordures dans les données et des ordures dans la requête, mais le problème persiste.

0
Adam111p