2010-01-09 8 views
21

To jest chyba prosty problem, ale nie otrzymuję jeszcze rozwiązania. Chciałbym uzyskać prawidłowe liczby tylko z kolumny, jak wyjaśniono tutaj.Operator podobny do sql, aby uzyskać tylko numery

Powiedzmy mamy kolumnę varchar z następujących wartości

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

problemem jest wybrać tylko numery

select * from tbl where answer like '%[0-9]%' byłoby to zrobić ale zwraca

234.62 
    2:234:43:22 
    6435.23 
    2 

Tutaj oczywiście 2: 234: 43: 22 nie jest pożądany, ponieważ nie jest prawidłową liczbą.

Pożądany wynik jest

 234.62 
     6435.23 
     2 

Czy istnieje sposób, aby to zrobić?

Odpowiedz

20

możesz spróbować tej

ISNUMERIC (Transact-SQL)

IsNumeric zwraca 1 gdy wyrażenie wejściowe ocenia się ważnego numerycznej typu danych; w przeciwnym razie zwraca 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 To znacznie lepsze rozwiązanie niż moje. Opuszczę moje, ponieważ wydaje się, że działa w tym ograniczonym przypadku, ale po prostu pokazuje, że muszę nauczyć się wszystkich wbudowanych funkcji. –

+0

Sure David Same tutaj (trzeba nauczyć się wbudowanych funkcji) :)! Twoja odpowiedź z podobnym jest również dobra. – Thunder

+0

Niestety, ISNUMERIC zaakceptuje singletony z + -. – gbn

8

Spróbuj coś takiego - to działa przypadków zostały wymienione.

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

można użyć następujących jedynie zawierać prawidłowe znaki:

SQL

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

Rezultaty

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

[Wymaga klauzuli collate lub użyj zestawu zamiast zakresu] (http://dba.stackexchange.com/questions/34730/why-are-non-digits-like-0-9/34731#34731) –

+4

I wiem, że to bardzo przestarzały post, ale właśnie go spotkałem. Nadal uważam za konieczne zwrócenie uwagi, że zwróci to adres IP (lub dowolną inną wartość z wieloma punktami dziesiętnymi). –

+0

To jest świetna odpowiedź! Aby odpowiedzieć na powyższe komentarze, wystarczy dołączyć isnumeric: "WHERE Col NOT LIKE"% [^ 0-9.]% 'AND ISNUMERIC (Col) = 1' –

1

z SQL 2012 i później, można użyj TRY_CAST/TRY_CONVERT, aby spróbować przekonwertować na typ liczbowy, np. TRY_CAST(answer AS float) IS NOT NULL - należy jednak pamiętać, że będzie to również zgodne z notacją naukową (1 + E34). (Jeśli użyjesz decimal, notacja naukowa nie będzie zgodna)

Powiązane problemy