2016-03-21 8 views
2

ich die Ausgabe zu tun haben, wenn ich einen wählenEntfernen alphabetische Zeichen aus dem Ergebnis in mysql select-Anweisung

tun
select * from testing 

123varc  
[email protected] 
[email protected] 
470rt!dd 
45sd3 
tt123rc 
[email protected] 
470rt!dd 
45sd3 
tt123rc 

Wie kann ich die Abfrage in MySQL schreiben, so dass es alle Buchstaben entfernen wird und zeigen Sie mir den Ergebnis.

Ich meine das Ergebnis zu sagen, kommen als

123  
123 
123 
470 
453 
123 
123 
470 
453 
123 

Vielen Dank SKP

+0

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. –

+2

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) –

+0

Um Daten in ein neues Feld zu extrahieren – user3160866

Antwort

1

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 
Verwandte Themen