Es gibt keine einzige MySQL integrierte Funktion, die die Zeichenfolge Manipulation erreichen wird.
Es sieht so aus, als ob Sie mehr als "alphabetische" Zeichen entfernen möchten; Es wird auch ein @
Zeichen entfernt. Es wirft die Frage auf, was Sie mit anderen Zeichen tun möchten, die in einer Zeichenkette vorkommen könnten, wie Leerzeichen, Tabulatoren, Semikolons, Punkte und einer Menge anderer Zeichen. Wir können nicht von der Frage erzählen.
Aber es sieht fast so aus, als ob Sie wirklich nur numerische Ziffern, 0
bis 9
"behalten" möchten.
Um die SQL einfach zu halten (um die Komplexität zu verbergen) könnten wir eine MySQL-Funktion schreiben (gespeichertes Programm), die eine Zeichenfolge zurückgibt. Und dann referenziere diese Funktion in der SQL.
Es gibt ein paar Nachteile. Ein anderes Datenbankobjekt, das SQL, das die Funktion verwendet, ist nicht portierbar in eine andere Datenbank (ohne auch die Funktion zu implementieren).
Aber die native SQL, um dies zu tun ist nicht schön, egal wie Sie es schneiden.
Wenn die maximale Anzahl von Zeichen in der Zeichenfolge begrenzt ist, wie in zehn Zeichen (die längste Zeichenfolge in Ihren Beispieldaten). Ich würde die Zeichenfolge in zehn einzelne Zeichen zerlegen und dann sehen, ob jedes Zeichen eines ist, das wir zurückgeben wollen.
Als erster Schritt, Zerhacken die Zeichenfolge in einzelne Zeichen und sie wieder zusammen verketten:
SELECT CONCAT(SUBSTR(foo,1,1)
, SUBSTR(foo,2,1)
, SUBSTR(foo,3,1)
, ...
, SUBSTR(foo,10,1)
) AS foo
(Das tut keine Entfernung von Zeichen, das ist veranschaulicht nur ein Muster, das Muster Expanding. in einer Kontrolle jedes einzelnen Zeichens hinzugefügt, entweder den Charakter der Rückkehr (wenn es ein wir behalten wollen), oder die leere Zeichenkette (für die Zeichen wollen wir nicht halten.)
SELECT CONCAT(IF(INSTR('1234567890',SUBSTR(foo,1,1)), SUBSTR(foo,1,1), '')
, IF(INSTR('1234567890',SUBSTR(foo,2,1)), SUBSTR(foo,2,1), '')
, IF(INSTR('1234567890',SUBSTR(foo,3,1)), SUBSTR(foo,3,1), '')
, ...
, IF(INSTR('1234567890',SUBSTR(foo,10,1)), SUBSTR(foo,10,1), '')
) AS bar
natürlich wenn das Ziel darin besteht, die zu entfernenden Charaktere zu identifizieren ved, und behalte alles andere, du könntest das umtauschen ... gib die leere Zeichenfolge zurück, wenn das Zeichen übereinstimmt, sonst gib das Zeichen zurück.
SELECT CONCAT(IF(INSTR('@#$abc',SUBSTR(foo,1,1)), '', SUBSTR(foo,1,1))
, IF(INSTR('@#$abc',SUBSTR(foo,2,1)), '', SUBSTR(foo,2,1))
, IF(INSTR('@#$abc',SUBSTR(foo,3,1)), '', SUBSTR(foo,3,1))
, ...
, IF(INSTR('@#$abc',SUBSTR(foo,10,1)), '', SUBSTR(foo,10,1))
) AS rab
Ist diese Abfrage für Extrahieren von Daten auf ein neues Feld oder für Echtzeit-Suche? Das Säubern Ihrer Daten in Echtzeit mit SQL ist sehr selten eine gute Idee. –
http://stackoverflow.com/a/11432734/477878 scheint jedoch eine Antwort auf Ihre Frage zu haben (auch wenn die ursprüngliche Frage das umgekehrte Problem war) –
Um Daten in ein neues Feld zu extrahieren – user3160866