2010-03-10 29 views
7

在包含整數(作爲字符串)和非整數字符串混合的表中,我有一個varchar(100)列。例如。SQL Server 2005將VARCHAR轉換爲INT,但默認爲無效類型

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

我該如何寫一個表達式,例如總結有效整數的所有值?如果我想嘗試:

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

我會收到Conversion failed when converting the varchar value 'Pyramids' to data type int.錯誤。

是否有我可以在我的表情中使用的測試,很像ISNULL()函數,允許我指定默認值,如果該字段不是數字?

回答

20

試試這個:

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

的情況下應檢查dimension是否是數字 - 如果是這樣,則返回值。如果它不是數字,則返回一個默認值(這裏是:0)

是否需要頻繁查詢,還可以將持久化計算列添加到封裝此計算並存儲該值的表中。通過這種方式,總結等等時,你並不總是重新計算值:

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

現在,您可以SELECT dimension, numericvalue FROM mytable並獲得兩個值,而無需執行任何計算。

+0

完美!謝謝! 'ISNUMERIC(' - 1.44')'和'ISNUMERIC('12')'返回1,而'ISNUMERIC('foobar')'返回0.正是我所需要的。 – 2010-03-10 18:31:22

1

你會碰到溢出問題,如果你有一個像varchar88888888888888888888888

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 
相關問題