it-swarm.com.de

Abfrage, die die Leerzeichen ignoriert

Was ist der beste Weg, um eine Abfrage auszuführen, damit Leerzeichen in den Feldern .__ ignoriert werden? Zum Beispiel die folgenden Abfragen:

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

würde folgende Einträge finden:

John Bob Jones
JohnBob Jones
JohnBobJones

Ich verwende PHP oder Python, aber ich denke, das spielt keine Rolle.

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

Es hängt davon ab, ob. Wenn Sie sich nicht für eine gute Leistung interessieren, können Sie viele Dinge tun, aber die meisten werden langsam sein. Vielleicht ist das OK für Sie, aber ich werde diese Antwort hier lassen, falls andere Leser eine schnelle Lösung wünschen.

Wenn Sie eine sehr schnelle Leistung wünschen, sollten Sie die Zeichenfolge ohne Leerzeichen in der Datenbank indizieren. In PostgreSQL können Sie einen Index für eine Funktion erstellen . Sie können dies verwenden, um einen Index für die Spalte zu erstellen, dessen Leerzeichen durch die leere Zeichenfolge ersetzt werden. Der Vorteil dieser Methode ist, dass außer der Indexerstellung keine Wartung erforderlich ist.

In MySQL können Sie dies nicht tun. Die einfachste Möglichkeit wäre, die Daten in der Datenbank zu kopieren - einmal mit Leerzeichen und einmal ohne. Verwenden Sie die Spalte ohne Leerzeichen in Ihrer WHERE-Klausel, aber die ursprüngliche Spalte in Ihrer SELECT-Spaltenliste. Dies erfordert mehr Wartung, da die Spalten synchron gehalten werden müssen. Sie können dies mit Anwendungslogik oder Datenbank-Triggern tun.

10
Mark Byers

Die vorgeschlagene Lösung sieht sehr gut aus, ist jedoch für die Leistung schrecklich, wenn die Abfrage mit etwas eingeschränkt werden kann 

SELECT * FROM mytable WO Benutzername wie 'John%' und REPLACE (Benutzername, '', '') = REPLACE ("John Bob Jones", '', '')

Sie können auch REGEXP verwenden.

SELECT * FROM mytable WO Benutzername REGEXP '^ John * Bob * Jones'

Und erinnere dich an die Leistung, die Bedienung in der wo im Allgemeinen schlechte Idee sind.

Werfen Sie einen Blick auf http://dev.mysql.com/doc/refman/5.7/de/pattern-matching.html

2
Mquinteiro

VERSUCHE DIES:

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

Wir möchten oft nach Text suchen, unabhängig von der Anzahl der Leerzeichen, Leerzeichen und Buchstaben.

Trimmen Sie nur Kleinbuchstaben, und ersetzen Sie alle nicht aus Word bestehenden Zeichen für ein Leerzeichen. 

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

return: hier ist ein langer Text mit vielen Leerzeichen und unterschiedlichen Charakteren.

Hier ist die Verwendung für die Suche. Nur die Reihenfolge der Wörter ist wichtig, nicht mehr. Und das ist schön.

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: hier ist ein langer Text mit vielen Leerzeichen und unterschiedlichen Charakteren.

Müll in Daten und Müll in der Abfrage, aber er findet sie trotzdem richtig.

0
Adam111p