2010-01-09 8 views
21

Dies ist ich denke, ein einfaches Problem, aber noch nicht die Lösung bekommen. Ich möchte die gültigen Zahlen nur aus einer Spalte erhalten, wie hier erläutert.sql wie Betreiber, um nur die Zahlen zu bekommen

Lets sagen, dass wir eine Varchar-Spalte mit folgenden Werten

ABC 
Italy 
Apple 
234.62 
2:234:43:22 
France 
6435.23 
2 
Lions 

Hier ist das Problem haben, ist Zahlen wählen nur

select * from tbl where answer like '%[0-9]%' es getan haben würde, aber es gibt

234.62 
    2:234:43:22 
    6435.23 
    2 

Hier offensichtlich ist 2: 234: 43: 22 nicht erwünscht, da es keine gültige Nummer ist.

Das gewünschte Ergebnis ist

 234.62 
     6435.23 
     2 

Gibt es eine Möglichkeit, dies zu tun?

Antwort

20

können Sie versuchen, diese

ISNUMERIC (Transact-SQL)

ISNUMERIC gibt 1 zurück, wenn der Eingang Ausdruck auf einen gültigen numerischen Datentyp ausgewertet wird; es sonst kehrt 0.

DECLARE @Table TABLE(
     Col VARCHAR(50) 
) 

INSERT INTO @Table SELECT 'ABC' 
INSERT INTO @Table SELECT 'Italy' 
INSERT INTO @Table SELECT 'Apple' 
INSERT INTO @Table SELECT '234.62' 
INSERT INTO @Table SELECT '2:234:43:22' 
INSERT INTO @Table SELECT 'France' 
INSERT INTO @Table SELECT '6435.23' 
INSERT INTO @Table SELECT '2' 
INSERT INTO @Table SELECT 'Lions' 

SELECT * 
FROM @Table 
WHERE ISNUMERIC(Col) = 1 
+1

+1 Dies ist eine weitaus bessere Lösung als meine. Ich werde meins verlassen, da es scheint, an diesem begrenzten Fall zu arbeiten, aber nur um zu zeigen, dass ich alle eingebauten Funktionen lernen muss. –

+0

Sure David Same hier (muss eingebaute Funktionen lernen) :)! Ihre Antwort mit like ist auch in Ordnung – Thunder

+0

Leider akzeptiert ISNUMERIC Singletons von + -. – gbn

8

so etwas wie dies versuchen - es für die Fälle funktioniert, wie Sie erwähnt haben.

select * from tbl 
where answer like '%[0-9]%' 
and answer not like '%[:]%' 
and answer not like '%[A-Z]%' 
32

Sie können die Verwendung nur Folgendes umfassen gültige Zeichen:

SQL

SELECT * FROM @Table 
WHERE Col NOT LIKE '%[^0-9.]%' 

Ergebnisse

Col 
--------- 
234.62 
6435.23 
2 
+3

[Benötigt eine Sortierklausel oder verwendet ein Set anstelle eines Bereichs] (http://dba.stackexchange.com/questions/34730/why-are-non-digits-like-0-9/34731#34731) –

+4

I Ich weiß, dass dies ein sehr veralteter Beitrag ist, aber ich bin gerade darauf gestoßen. Ich halte es immer noch für notwendig, darauf hinzuweisen, dass dies eine IP-Adresse (oder einen anderen Wert mit mehreren Dezimalstellen) zurückgibt. –

+0

Dies ist eine großartige Antwort! Um die obigen Kommentare zu behandeln, schließen Sie einfach isnumeric ein: 'WHERE Col NOT LIKE '% [^ 0-9.]%' UND ISNUMERIC (Col) = 1' –

1

Mit SQL 2012 und später, könnten Sie Verwenden Sie TRY_CAST/TRY_CONVERT versuchen, in einen numerischen Typ, z. TRY_CAST(answer AS float) IS NOT NULL - Beachten Sie jedoch, dass dies auch der wissenschaftlichen Notation entspricht (1 + E34). (Wenn Sie decimal verwenden, stimmt die wissenschaftliche Notation nicht überein)

Verwandte Themen