繁体   English   中英

SQL Server 2005将VARCHAR转换为INT,但默认为无效类型

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

我在表中有一个varchar(100)列,其中包含整数(作为字符串)和非整数字符串的混合。 例如

| 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.我会收到Conversion failed when converting the varchar value 'Pyramids' to data type int. 错误。

是否有我可以在我的表达式中使用的测试,就像ISNULL()函数一样,如果字段不是数字,我可以指定一个默认值?

尝试这个:

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

CASE应检查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并获取这两个值,而无需执行任何计算。

如果您有像88888888888888888888888这样的varchar那么您将遇到溢出问题

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM