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.
SELECT * FROM mytable
WHERE REPLACE(username, ' ', '') = REPLACE("John Bob Jones", ' ', '')
Ç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.
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
ESSAYE ÇA:
SELECT * FROM mytable WHERE username =REPLACE("John Bob Jones", ' ', '')
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.