2012-12-18 128 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的行,根據查詢的目標可以說是無用的。 :-) –

相關問題