2014-01-14 7 views
5

Ordnung hat, so habe ich eine riesige Liste von Einträgen, und in einer der Spalten (der Einfachheit halber nennen wir es num gibt es eine Zahl, so etwas wie 123456780000 (sie sind alle die gleiche Länge und Format), aber manchmal gibt es Felder, die etwas so aussehenSQLite, ob TEXT-Feld keine alphabetischen Zeichen in es

12345678E000 
or 
12345678H000 

Nun, ich brauche alle Zeilen zu löschen, in denen die num Spalte nicht vollständig numerisch Der Typ Nummer ist TEXT, nicht INTEGER. So sollten die obigen Beispiele gelöscht werden, während 123456780000 nicht sollte.

Ich habe zwei Lösungen ausprobiert, von denen eine funktioniert, aber unelegant und chaotisch ist, und die andere überhaupt nicht funktioniert.

Das erste, was ich versuchte, ist

DELETE FROM MY_TABLE WHERE abs(num) == 0.0 

Da nach der Dokumentation, abs (X) gibt genau 0,0, wenn ein TEXT Wert angegeben und ist unconvertable auf eine reelle Zahl. Also ich dachte, es sollte alle "nur Zahlen" passieren lassen und die mit einem Zeichen darin löschen. Aber es macht nichts, es löscht nicht einmal eine Zeile.

Das nächste, was ich versuchte, ist

DELETE FROM MY_TABLE WHERE num LIKE "%A%" OR "%B%" OR "%C%" 

Welche scheint zu funktionieren, aber die Datenbank ist groß und ich bin nicht sicher, welche Zeichen angezeigt werden können, und während ich nur "%D%" OR "%E%" OR "%F%" OR ... mit dem gesamten Alphabet tun könnte, diese fühlt sich unelegant und chaotisch an. Und ich möchte eigentlich etwas über die SQLite-Sprache lernen.

Meine Frage ist schließlich: Wie löse ich dieses Problem auf eine nette und einfache Art und Weise? Vielleicht gibt es etwas, was ich falsch mache mit der abs (X) Lösung, oder gibt es eine andere Möglichkeit, von der ich nicht weiß/dachte?

Vielen Dank im Voraus.

EDIT: Laut einem Kommentar habe ich versucht, SELECT abs(num) FROM MY_TABLE WHERE num like '%A%' und es gab den folgenden

12345678.0 

Das ist seltsam. Es scheint, dass es die Nummer geteilt hat, wo das Alphabet erschien. Die Dokumentation behauptet, dass sie 0.0 zurückgeben würde, wenn sie es nicht in eine Zahl konvertieren könnte. Hmm ..

+0

haben Sie versucht, 'wählen abs (num) wobei num like '% A%'' zu sehen, was zurückgegeben wird? –

+0

@ RaphaëlAlthaus Danke für Ihren Vorschlag, ich habe den Beitrag nach dem Versuch, Ihren Vorschlag zu bearbeiten. Überprüfen Sie das Ende meines Beitrags. – user3195734

Antwort

4

Sie können mit einer Reihe GLOB in SQLite verwenden, um sie herausgreifen:

SELECT * 
FROM MY_TABLE 
WHERE num GLOB '*[A-Za-z]*' 

Sehen sie in Verwendung mit dieser Geige: http://sqlfiddle.com/#!7/4bc21/10

Zum Beispiel für diese Datensätze:

num 
---------- 
1234567890 
0987654321 
1000000000 
1000A00000 
1000B00000 
1000c00000 

GLOB '*[A-Za-z]*' kehrt diese drei:

num 
---------- 
1000A00000 
1000B00000 
1000c00000 

Sie können dann übersetzen, dass in den entsprechenden DELETE:

DELETE 
FROM MY_TABLE 
WHERE num GLOB '*[A-Za-z]*' 
+1

'WHERE num GLOB '* [A-z] *'' macht es noch kürzer. – marderh

+0

Das hat perfekt funktioniert. Ich danke dir sehr. – user3195734

Verwandte Themen