2010-09-14 186 views
4

我有一個字段是一個varchar和字符串存儲爲"1,223""23,342,234"sql server:是否可以將1,123轉換爲數字?

他們有昏迷!

是否可以將它們讀取爲numbers

我不喜歡任何這些答案。在mysql中讀取varchar 1,123並將其轉換爲數字完全沒有問題。

+6

下面的答案是正確的。但是,如果這是某種應用程序的數據庫,那麼爲什麼不按照即將進入的值(即,當您更新或插入時),只需執行','即可在那裏進行剝離。而不是試圖修復數據,修復它,因爲它進去了。 – RPM1984 2010-09-14 23:39:53

+0

@ RPM1984,好點! – 2010-09-14 23:40:24

+0

嗯,也許我應該把它當作答案。 =) – RPM1984 2010-09-14 23:41:23

回答

0

取決於Windows區域配置設置AFAIK。

+0

可以詳細說明這個嗎? – 2010-09-14 23:36:01

+0

它與Windows區域配置無關。其他答案是正確的。 – RPM1984 2010-09-14 23:38:14

+0

逗號不作爲小數點分隔符使用。 – 2010-09-14 23:39:45

2
select Cast(Replace(myfield, ",","") as int) 
+0

不能使用雙引號。我贏了:) – 2010-09-14 23:36:34

+0

@abe,是的,但它仍然是正確的。 – DForck42 2010-09-15 14:53:26

4

就什麼也沒有更換任何逗號和強制轉換爲一個int:如果您現有的select語句看起來像這樣

SELECT CAST(REPLACE(NumberString,',','') as INT) 
3

select field1 from table 

你可以用這個來代替轉換filed1 to a number:

select cast(replace(field1, ',', '') as int) from table 
2

只是去掉了逗號,做投:

SELECT CAST(REPLACE('12,345', ',', '') AS DECIMAL(32,2)) 
6

你可以通過錢去的數據類型:

CAST(CAST(value AS MONEY) AS INT) 

當鑄造VARCHAR到MONEY千位分隔符allowed。此外,從貨幣到其它數值類型隱式轉換是允許的,所以你也許可以逃脫

CAST(value AS MONEY) 

可能是有趣的,看看相對錶現,但我很驚訝地看到太大的區別。 但是...可能取決於您的目標數據類型 - 對於通過MONEY進行的整數類型可能會...昂貴。

更新

嗯,這是比我預期更多不同的 - 看到丹尼斯的回答。我想這反映了使用像REPLACE這樣的通用函數的成本與更特殊的CAST VARCHAR到MONEY的成本。

+0

美麗!真漂亮。 – 2010-09-15 07:17:59

+0

我剛剛對此解決方案進行了壓力測試,結果令人驚歎! UH-MAZING!只需要1.5秒鐘,就可以使用您的投幣轉換方法將100萬個'NNN,NNN,NNN'數字轉換並存儲在臨時表中。並通過刪除逗號的方法10.6秒。 – 2010-09-15 07:35:58

+0

從( )中選擇最小(mn),最大(mn)完整 與 SELECT MIN(MN),最大值(MN),AVG(MN) 從( 選擇流延(替換(N, '', '')作爲BIGINT)MN 從temp.money )米 - 平均需要10.6秒才能完成 – 2010-09-15 07:36:21

1

我相信你對這個問題的表現方面都很感興趣。

強制測試鑄造爲貨幣當時的bigint方法。

在一個快速和骯髒的方式填充測試數據:

;with ids as 
(
select cast(abs(checksum(newid())%1000) as varchar) [1] 
,cast(abs(checksum(newid())%1000) as varchar) [2] 
,cast(abs(checksum(newid())%1000) as varchar) [3] 
union all 
select cast(abs(checksum(newid())%1000) as varchar) 
,cast(abs(checksum(newid())%1000) as varchar) 
,cast(abs(checksum(newid())%1000) as varchar) 
from ids 
) 
, enum as (
select [1]+','+[2]+','+[3] n, row_number() over(order by (select 0)) rn 
from ids 
where len([1]) = 3 and len([2]) = 3 and len([3]) = 3 
) 
select rn, n 
into temp.[money] 
from enum 
where rn <= 1000000 
option (maxrecursion 0) 

現在是時候進行壓力測試我們最初的做法,當我們要刪除所有從一個字符串逗號:

select min(mn), max(mn), avg(mn) 
from (
select cast(replace(n,',','') as bigint) mn 
from temp.money 
) m 

完成平均需要10.6秒!

最後,這通過貨幣方式:

select min(mn), max(mn), avg(mn) 
from (
select cast(cast(n as money) as bigint) mn 
from temp.money 
) m 

平均需要1.5秒完成!

相關問題