开发者

SQL Server 2005 Convert VARCHAR to INT but default on invalid type

I have a varchar(100) column in a table that contains a mix of integers (as strings) and non-integer strings. E.g.

| dimension varchar(100) |
| '5'                    |
| '17'                   |
| '3开发者_JS百科'                    |
| 'Pyramids'             |
| 'Western Bypass'       |
| '15'                   |

How can I write an expression to, e.g. sum up all the values that are valid integers? If I were to try:

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

I would receive a Conversion failed when converting the varchar value 'Pyramids' to data type int. error.

Is there a test I can use in my expression, much like the ISNULL() function, that permits me to specify a default value if the field is not a number?


Try this:

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

The CASE should check whether dimension is numeric - if so, return that value. If it's not numeric, return a default value (here: 0)

Is you need to query that quite frequently, you could also add a persisted, computed column to your table which encapsulates this computation and stores the value. This way, when summing and so on, you're not always re-computing the value:

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

Now, you can SELECT dimension, numericvalue FROM mytable and get both values without any computation having to be executed.


You're going to run into overflow problems if you have a varchar like 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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜