2010-03-10 9 views
7

Mam kolumnę varchar (100) w tabeli, która zawiera kombinację liczb całkowitych (jako ciągi) i niecałkowitych ciągów. Na przykład.SQL Server 2005 Konwertuj VARCHAR na INT, ale domyślnie na nieprawidłowy typ

| dimension varchar(100) | 
| '5'     | 
| '17'     | 
| '3'     | 
| 'Pyramids'    | 
| 'Western Bypass'  | 
| '15'     | 

Jak napisać wyrażenie do np. podsumować wszystkie wartości, które są poprawnymi liczbami całkowitymi? Jeśli miałbym spróbować:

-- should return 5 + 17 + 3 + 15 = 40 
SELECT 
    SUM(CONVERT(INT, dimension)) 
FROM 
    mytable 

Zostałby wyświetlony błąd Conversion failed when converting the varchar value 'Pyramids' to data type int..

Czy istnieje test, którego można użyć w moim wyrażeniu, podobnie jak funkcja ISNULL(), która pozwala mi określić wartość domyślną, jeśli pole nie jest liczbą?

Odpowiedz

20

Spróbuj tego:

SELECT 
    SUM(CASE ISNUMERIC(dimension) 
      WHEN 1 THEN CONVERT(INT, dimension) 
      ELSE 0 
     END) 
FROM 
    mytable 

sprawa powinna sprawdzić, czy dimension jest numeryczne - jeśli tak, to powrót tej wartości. Jeśli nie jest to wartość numeryczna, należy zwrócić wartość domyślną (tutaj: 0)

Czy często trzeba wysyłać zapytania, można również dodać do tabeli utrwaloną kolumnę obliczeniową, która uwzględnia to obliczenie i przechowuje wartość. W ten sposób, gdy zsumowanie i tak dalej, jesteś nie zawsze ponowne obliczenie wartości:

ALTER TABLE mytable 
    ADD NumericValue AS CASE ISNUMERIC(dimension) 
     WHEN 1 THEN CONVERT(INT, dimension) ELSE 0 END PERSISTED 

Teraz można SELECT dimension, numericvalue FROM mytable i dostać obie wartości bez konieczności obliczeń do wykonania.

+0

Perfect! Dziękuję Ci! 'ISNUMERIC ('- 1.44')' i 'ISNUMERIC ('12')' zwracają 1, podczas gdy 'ISNUMERIC ('foobar')' return 0. Właśnie to, czego potrzebowałem. –

1

Będziesz napotkasz problemy przepełnienia jeśli masz varchar jak 88888888888888888888888

select 
SUM(
    CASE 
     WHEN ISNUMERIC(CheckCol+ '.0e0') = 1 AND 
     convert(decimal(38,0), CheckCol) 
     BETWEEN -2147483648 AND 2147483647 
    THEN 1 
    ELSE 0 
    END 
) 
from Table 
Powiązane problemy