2012-12-18 124 views
0

我已阅读了大量类似标题的帖子,但没有回答我的问题。将数据类型varchar转换为bigint时出错(使用REPLACE)

我有一张人口数据列表。列中的数字用逗号分隔(当然,这不是最佳做法,但在这一点上超出了我的控制范围)。我需要删除逗号以便对数据进行一些数学运算,但是我收到了标题中提到的错误。以下是应该返回数据的查询后面的前几行数据:

POPULATION (No column name) 
7,859,000  7859000 
    575,660  575660 
    818,000  818000 
5,254,000  5254000 
73,751,000 73751000 
38,610,000 38610000 

SELECT [population], 
     CONVERT(bigint,REPLACE(cri.[population],',','')) 
FROM Country_Region_Info AS cri 

但是,该查询返回上述错误。唯一能让它工作的方法是用数字(20,0)替换bigint。我不应该那样做。没有什么是远程接近bigint的最大值。没有小数。没有前导或尾随空格。这里发生了什么?

我不明白的另一件事:查询的bigint版本返回结果如果TOP 5包含在SELECT中,但是在TOP 6或更多的错误。在不同的计算机上,它与TOP 2一起使用,但在TOP 3或更高版本上出现错误。

+1

这不会返回什么? '从Country_Region_Info中选择顶部5 *,其中人口像'%[^ 0-9,]%'' –

+1

不确定这里发生了什么 - 我无法重现这一点,在我的SQL Server 2008 R2实例中工作得很好:-( –

+3

我几乎可以保证你在人口列中至少有一行数据有问题,这是你将数字存储为字符串所付出的代价,你说它超出了你的控制范围,但是请回击这个可怕的设计决定。 –

回答

2

对问题进行调查,这样做:

select * 
from Country_Region_Info cri 
where isnumeric(REPLACE(cri.[population],',','')) = 0 or cri.population like '%.%' 

这将找到进攻数值。

要忽略这些值:

SELECT [population], 
     (case when isnumeric(REPLACE(cri.[population],',','')) = 1 and cri.population not like '%.%' 
      then CONVERT(bigint,REPLACE(cri.[population],',','')) 
     end) 
FROM Country_Region_Info AS cri 

你还有其他数字格式的可能性(“7E6”),但这些可能不是你的数据。

+0

好的,谢谢戈登。对彼得·拉多基亚也是如此。这些查询返回了包含错误数据的两行(19.082,000和10,797.000)。我应该知道。同意,亚伦,我会考虑用“即将成为的力量”来改变这一点。 –

+0

+1,但是你可以在这里添加一个where子句 - 目前你会在第二列中返回NULL的行,根据查询的目标可以说是无用的。 :-) –

相关问题