2010-04-25 14 views
26

Was ist die beste Möglichkeit, eine Abfrage auszuführen, so dass Leerzeichen in den Feldern ignoriert werden? Zum Beispiel können die folgenden Abfragen:Abfrage, die die Leerzeichen ignorieren

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

würden die folgenden Einträge:

John Bob Jones 
JohnBob Jones 
JohnBobJones 

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

+1

PostgreSQL oder MySQL? Die beste Lösung kann in jedem Fall anders sein. Zu versuchen, etwas zu schreiben, das in beiden funktioniert, ist normalerweise ein Rezept für eine langsame Abfrage. –

Antwort

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

funktioniert auch perfekt in firebird2.5. – lordvlad

+0

Sie können die REPLACE() - Funktion auch mit LIKE-Operatoren und Platzhaltern verwenden. Zum Beispiel: SELECT * FROM mytable REPLACE (Benutzername, '', '') WIE ERSETZEN ("John B%", '', ''); –

-1

Eine Möglichkeit wäre, LIKE und WildCards zu verwenden, um Ihre Abfrage Citeria zu erstellen. Etwas wie:

SELECT * FROM meine Tabelle WHERE Benutzername LIKE 'John Bob Jones';

+15

Dies wird fälschlicherweise "John Paul Bob Jones" entsprechen. – SLaks

+0

Diese Antwort ist falsch. –

10

Kommt drauf an. Wenn Sie nicht auf gute Leistung achten, dann gibt es viele Dinge, die Sie tun könnten, aber die meisten von ihnen werden langsam sein. Vielleicht ist das in Ordnung für Sie, aber ich werde diese Antwort hier lassen, falls andere Leser eine schnelle Lösung wünschen.

Wenn Sie sehr schnelle Leistung wünschen, sollten Sie die Zeichenfolge ohne Leerzeichen in der Datenbank indizieren. In PostgreSQL können Sie create an index on a function. Sie können dies verwenden, um einen Index für die Spalte mit Leerzeichen zu erstellen, die durch die leere Zeichenfolge ersetzt werden. Der Vorteil dieser Methode ist, dass sie abgesehen vom Erstellen des Index keine Wartung benötigt.

In MySQL können Sie dies nicht tun, also wäre der einfachste Weg, die Daten in der Datenbank zu duplizieren - 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.

+0

guten Punkt, ich habe gerade mySQL REPLACE in einer PLZ-Suche versucht und wow ... es ist langsam ... Danke für den Tipp! – Ford

1

AUSPROBIEREN:

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

würde "JohnBob Jones" nicht finden – Alan

2

Die vorgeschlagene Lösung sehr gut aussehen, aber ist schrecklich für die Leistung, wenn es möglich ist, wie die Abfrage mit etwas beschränkt

SELECT * FROM mytable WHERE username wie ‚John % 'und REPLACE (Benutzername,' ',' ') = ERSETZEN ("John Bob Jones",' ',' ')

Auch Sie können REGEXP verwenden.

SELECT * FROM mytable WHERE username REGEXP '^ John * Bob * Jones'

Und die Leistung erinnern, den Betrieb in dem, wo in der Regel keine gute Idee sind.

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

0

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

Nur trimmen, Kleinbuchstaben und ersetzen Sie alle Multiple Nicht-Wort-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 

Rückkehr: hier ist ein langer Text mit vielen weißen Flecken und anderen Charakter empfindlich

Hier wird die Verwendung für die Suche ist. 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') 

Rückkehr: hier ist ein langer Text mit vielen weißen Flecken und anderem Charakter empfindlich

Garbage in Daten und Junk in der Abfrage, aber es findet es immer noch richtig.

Verwandte Themen