2016-07-25 9 views
4

Ich möchte eine SQL-Abfrage schreiben, die alle Studenten, die in einer bestimmten Postleitzahl leben. Folgendes ist meine Abfrage.Wie man mit Leerzeichen in Sql umgehen kann

SELECT * FROM `students` AS ss WHERE ss.`postcode` LIKE 'SE4 1NA'; 

Jetzt ist die Frage, die gespeichert in der Datenbank sind einige Datensätze ohne die weißen Raum Postleitzahl ist, wie SE41NA und einige auch in Klein, wie se41na oder se4 1na sein kann.

Die Abfrage gibt mir unterschiedliche Ergebnisse basierend darauf, wie der Datensatz gespeichert wird. Gibt es eine Möglichkeit, damit umzugehen?

+0

Haben Sie versucht, den Operator **% ** zu verwenden? –

+0

Sehen Sie sich mit 'ersetzen 'an ... Ich bezweifle, dass der Kleinbuchstabe zählt, es sei denn, Sie haben etwas manuell geändert. – sgeddes

+0

@sgeddes Es kann (Kleinbuchstaben) abhängig von der MySQL-Konfiguration. –

Antwort

3

Verwenden regexp ist eine Möglichkeit, es zu tun. Dies führt standardmäßig eine Übereinstimmung zwischen Groß- und Kleinschreibung durch.

SELECT * FROM students AS ss 
WHERE ss.postcode REGEXP '^SE4[[:space:]]?1NA$'; 

[[:space:]]? entspricht einem optionalen Leerzeichen.

REGEXP documentation MySQL

2

Ob Fall zählt, hängt von der Sortierung der Zeichenfolge/Spalte/database/Server. Aber Sie können es umgehen, indem Sie:

WHERE UPPER(ss.postcode) LIKE 'SE4%1NA' 

Die % wird eine beliebige Anzahl von Zeichen übereinstimmen, einschließlich keine. Es ist ein bisschen zu allgemein für das, was Sie wirklich brauchen könnten - aber es sollte in der Praxis gut funktionieren.

Das wichtigere Problem ist, dass Ihre Datenbank die eingegebenen Daten nicht validiert. Sie sollten die Anwendung so korrigieren, dass die Postleitzahlen korrekt sind und einem Standardformat folgen.

0
SELECT * 
    FROM students AS ss 
WHERE UPPER(ss.postcode) LIKE SELECT REPLACE(UPPER('SE4 1NA'), ' ', '%'); ; 

Ich schlage vor, die Leerzeichen mit dem '%' Platzhalter zu ersetzen. Transformation auch der Fall zu den oberen zu den beiden Seiten des LIKE Operator

0
SELECT * FROM students AS ss 
    WHERE UPPER(REPLACE(ss.postcode, ' ', '')) = 'SE41NA' ; 
2

verwenden eine Kombination von UPPER und REPLACE.

SELECT * 
FROM students s 
WHERE UPPER(REPLACE(s.postcode, ' ', '')) LIKE '%SE41NA%' 
+0

Wenn der Leerraum in der Mitte des Textes ist, dann wird oben eine falsche Daten geben –

+1

Leerraum wird mit der 'REPLACE' Funktion ersetzt, also nein, würde es nicht. – Matt

+0

zunächst tut mir leid. Ich merke das nicht. aber nach meiner Meinung Upper und ersetzen haben weniger Leistung zu vergleichen REGEXP –

Verwandte Themen