2009-03-10 20 views
3

Ich versuche, den besten Weg zu finden, um nicht numerische Daten aus einem Varchar in SQL zu entfernen, z.Entfernen numerischer Daten aus einer Zahl + SQL

'(082) 000-0000' to '0820000000' or 
'+2782 000 0000' to '0820000000' 

Die Schwierigkeit ist, ich bin nicht immer sicher, welche Zahlenformate in kommen, wie oben gezeigt, so mag ich mag alles, das im Wesentlichen keine Zahl entfernt ist.

Update:
Von dem, was euch gesagt haben, dies ein wenig Spitze ist getan:

declare @Num varchar(20) 

set @Num = ' + (82) 468 6152 ' 

--strip nonnumrical data out of @num 

print @Num 

set @Num = replace(@Num, ' ', '') 
set @Num = replace(@Num, '+', '') 
set @Num = replace(@Num, '-', '') 
set @Num = replace(@Num, '(', '') 
set @Num = replace(@Num, ')', '') 

print @Num 

konnte nicht ersetzen bekommen [^ 0-9] Ausdruck rechts though.

+0

verwenden Sie ms sql? –

+0

Ah, ein anderer Südafrikaner (oder zumindest jemand, der sich mit Südafrika beschäftigt) findet SO :) –

+0

Sorry Leute, Ja ich benutze MS SQL;) –

Antwort

3

Wenn Sie SQL Server 2005 oder neuer verwenden, erstellen Sie am besten eine user-defined CLR function und verwenden Sie einen regulären Ausdruck, um alle nicht numerischen Zeichen zu entfernen.

Wenn Sie keine CLR-Funktion verwenden möchten, können Sie eine benutzerdefinierte Standardfunktion erstellen. Dadurch wird die Arbeit erledigen, obwohl es nicht so effizient sein wird:

CREATE FUNCTION dbo.RemoveNonNumerics(@in VARCHAR(255)) 
RETURNS VARCHAR(255) 
AS 
BEGIN 
    DECLARE @out VARCHAR(255) 

    IF (@in IS NOT NULL) 
    BEGIN 
     SET @out = '' 

     WHILE (@in <> '') 
     BEGIN 
      IF (@in LIKE '[0-9]%') 
       SET @out = @out + SUBSTRING(@in, 1, 1) 

      SET @in = SUBSTRING(@in, 2, LEN(@in) - 1) 
     END 
    END 

    RETURN(@out) 
END 

Und dann aus Ihrer Tabelle auswählen wie folgt:

SELECT dbo.RemoveNonNumerics(your_column) AS your_tidy_column 
FROM your_table 
+0

Danke Luke, hab sql 2000, also werde sowas machen. :) –

0

Es ist viel einfacher, String-Parsing in Ihrer Business-Schicht zu behandeln. Allerdings gebend, dass die T-SQL-Funktion REPLACE() verwenden (unter der Annahme von MS SQL).

Sie könnten eine Schleife mit dieser Funktion für den Parameter ausführen, der übergeben wurde, um alle nicht numerischen Buchstaben daraus zu entfernen.

1

Werfen Sie einen Blick auf this post (es ist der 8. Post nach unten - die erste lange), die Details zur Verwendung von regulären Ausdrücken in SQL Server. Es ist nicht die schnellste (das wäre es, bevor Sie SQL erreichen), aber es bietet eine gute Möglichkeit, es zu tun.

0

Welche Art von SQL-Backend verwenden Sie? Wenn es eine regexp_replace-Art von Funktion gibt, könnten Sie damit [^ 0-9] mit nichts ersetzen.

1

Je nach DBMS gibt es verschiedene Möglichkeiten.

Für T-SQL hat this link einige gute Ansätze.

0

Die effektivste und flexibel, dass ich gefunden habe, ist es, die Zahlen mit/tally table method wie in mwigdahls Antwort vom 10. März 2009 gezeigt

dh eine Liste der erlaubten Einträge ist viel sicherer als die Do-not-allow-Liste, die Sie am Ende Ihrer Frage oben angegeben haben.

Was Sie nicht angegeben haben, ist, wie Sie mit Nicht-Ganzzahlen umgehen ... was machen Sie mit Dezimalstellen?

Verwandte Themen