2009-02-27 17 views
2

Angenommen, es gibt eine Tabelle "A" mit 2 Spalten - ID (INT), DATA (VARCHAR (100)). „SELECT Daten aus einer“ Ergebnisse in einer Tabelle durchführen wie folgt aussieht:So extrahieren Sie numerische Daten aus dem SQL-Ergebnis

DATA 
--------------------- 
Nowshak 7,485 m 
Maja e Korabit (Golem Korab) 2,764 m 
Tahat 3,003 m 
Morro de Moco 2,620 m 
Cerro Aconcagua 6,960 m (located in the northwestern corner of the province of Mendoza) 
Mount Kosciuszko 2,229 m 
Grossglockner 3,798 m 
// the DATA continues... 
--------------------- 

Wie kann ich nur die numerischen Daten mit einer Art von String-Verarbeitungsfunktion in der SELECT-SQL-Abfrage zu extrahieren, so dass das Ergebnis aus einem modifizierten SELECT würde so aussehen:

DATA (in INTEGER - not varchar) 
--------------------- 
7485 
2764 
3003 
2620 
6960 
2229 
3798 
// the DATA in INTEGER continues... 
--------------------- 

Übrigens wäre es am besten, wenn dies in einer einzigen SQL-Anweisung getan werden könnte. (Ich bin mit IBM DB2 Version 9.5)

Thanks :)

+0

Welche Plattform verwenden Sie? – Quassnoi

+0

IBM DB2 Version 9.5 (Die neue Version, die nativen XML-Speicher unterstützt.) – natch3z

Antwort

2

In Oracle:

SELECT TO_NUMBER(REGEXP_REPLACE(data, '[^0-9]', '')) 
FROM a 

In PostgreSQL:

SELECT CAST(REGEXP_REPLACE(data, '[^0-9]', '', 'g') AS INTEGER) 
FROM a 

In MS SQL Server und DB2, müssen Sie Erstellen Sie UDF für reguläre Ausdrücke und Abfrage wie folgt.

Siehe Links für weitere Details.

+0

Es tut mir leid. Ich habe vergessen zu erwähnen, dass ich DB2 Version 9.5 verwende. – natch3z

+0

hat nie gewusst, dass Sie regex in sql +1 –

+0

können Sie einen für MSSQL Server veröffentlichen? –

2

Bei einer schnellen Online-Suche nach DB2 ist die beste integrierte Funktion, die ich finden kann, Translate Sie können eine Liste von Zeichen angeben, die Sie in andere Zeichen ändern möchten. Es ist nicht ideal, aber Sie können jedes Zeichen angeben, das Sie entfernen möchten, das heißt, jedes nicht numerische Zeichen verfügbar ...

(Ja, das ist eine lange Liste, eine sehr lange Liste, weshalb ich sage es ist nicht ideal)

LATE ('Daten', 'abc ... XYZ,/\ <> |.? [und so weiter]', ' ‚)

Alternativ müssen Sie einen Benutzer erstellen definiert Funktion, um nach der Nummer zu suchen. Dafür gibt es ein paar Alternativen.

  1. Überprüfen Sie jedes Zeichen einzeln und behalten Sie es nur bei, wenn es sich um eine Zahl handelt.

  2. Wenn Sie wissen, was die Zahl vorausgeht und was die Zahl folgt, können Sie für die Suche und halten, was dazwischen ...

    ist
-1

Um auf dems der suggeston zu erarbeiten, den Ansatz Ich habe verwendet wird eine benutzerdefinierte Skalarfunktion (UDF), die eine alphanumerische Zeichenfolge akzeptiert und rekursiv durch die Zeichenfolge (ein Byte pro Iteration) iteriert und die nicht numerischen Zeichen aus der Ausgabe unterdrückt. Der rekursive Ausdruck generiert eine Zeile pro Iteration, aber nur die letzte Zeile wird beibehalten und an die aufrufende Anwendung zurückgegeben.

+0

Das ist schrecklich langsam. – Hogan

4

Ich weiß, dass dieser Thread alt ist, und das OP braucht die Antwort nicht, aber ich musste das mit ein paar Hinweisen von diesem und anderen Threads herausfinden. Sie alle scheinen die genaue Antwort zu vermissen.

Der einfache Weg, um dies zu tun ist TRANSLATE alle nicht benötigten Zeichen zu einem einzelnen Zeichen, dann REPLACE das einzelne Zeichen mit einer leeren Zeichenfolge.

DATA = 'Nowshak 7,485 m' 

# removes all characters, leaving only numbers 
REPLACE(TRANSLATE(TRIM(DATA), '_____________________________________________________________________________________________', ' abcdefghijklmnopqrstuvwzyaABCDEFGHIJKLMNOPQRSTUVWXYZ`[email protected]#$%^&*()-_=+\|[]{};:",.<>/?'), '_', '') 
=> '7485' 

Um zu brechen die TRANSLATE Befehl:

TRANSLATE(FIELD or String, <to characters>, <from characters>) 

z.B.

DATA = 'Sample by John' 

TRANSLATE(DATA, 'XYZ', 'abc') 
=> a becomes X, b becomes Y, c becomes Z 
=> 'SXmple Yy John' 

** Hinweis: Ich kann nicht mit der Leistungs- oder Versionskompatibilität sprechen. Ich bin auf einer Version 9.x von DB2 und neu in der Technologie. Hoffe, das hilft jemandem.

+0

Sie brauchen hier nicht den 'REPLACE', wenn der erste Parameter' '' 'ist, werden alle diese Zeichen entfernt. Sie können auch die "UPPER" -Funktion verwenden, so dass Sie keine Kleinbuchstaben auflisten müssen. – Hogan

+0

@Hogan, 'TRANSLATE()' benötigt im zweiten Parameter die gleiche Anzahl an Zeichen wie im dritten Parameter, daher ist 'REPLACE' erforderlich (zumindest in meiner Version 9.x von DB2). Außerdem würde die Verwendung von "UPPER()" funktionieren und vereinfacht den Übersetzungsbefehl, aber ich bin mir nicht sicher, ob das insgesamt effizienter ist. –

+0

Schauen Sie sich das letzte Beispiel an, es entfernt die "u" http://www.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000862. html Verwenden Sie eine Version vor 9.7? :) '' TRANSLATE (x, '1234567890', '1234567890 ....') 'würde gut funktionieren. – Hogan

Verwandte Themen