我有一個字段是一個varchar
和字符串存儲爲"1,223"
或"23,342,234"
sql server:是否可以將1,123轉換爲數字?
他們有昏迷!
是否可以將它們讀取爲numbers
?
我不喜歡任何這些答案。在mysql中讀取varchar 1,123
並將其轉換爲數字完全沒有問題。
我有一個字段是一個varchar
和字符串存儲爲"1,223"
或"23,342,234"
sql server:是否可以將1,123轉換爲數字?
他們有昏迷!
是否可以將它們讀取爲numbers
?
我不喜歡任何這些答案。在mysql中讀取varchar 1,123
並將其轉換爲數字完全沒有問題。
取決於Windows區域配置設置AFAIK。
可以詳細說明這個嗎? – 2010-09-14 23:36:01
它與Windows區域配置無關。其他答案是正確的。 – RPM1984 2010-09-14 23:38:14
逗號不作爲小數點分隔符使用。 – 2010-09-14 23:39:45
select Cast(Replace(myfield, ",","") as int)
不能使用雙引號。我贏了:) – 2010-09-14 23:36:34
@abe,是的,但它仍然是正確的。 – DForck42 2010-09-15 14:53:26
就什麼也沒有更換任何逗號和強制轉換爲一個int:如果您現有的select語句看起來像這樣
SELECT CAST(REPLACE(NumberString,',','') as INT)
:
select field1 from table
你可以用這個來代替轉換filed1 to a number:
select cast(replace(field1, ',', '') as int) from table
只是去掉了逗號,做投:
SELECT CAST(REPLACE('12,345', ',', '') AS DECIMAL(32,2))
你可以通過錢去的數據類型:
CAST(CAST(value AS MONEY) AS INT)
當鑄造VARCHAR到MONEY千位分隔符是allowed。此外,從貨幣到其它數值類型隱式轉換是允許的,所以你也許可以逃脫
CAST(value AS MONEY)
可能是有趣的,看看相對錶現,但我很驚訝地看到太大的區別。 但是...可能取決於您的目標數據類型 - 對於通過MONEY進行的整數類型可能會...昂貴。
更新
嗯,這是比我預期更多不同的 - 看到丹尼斯的回答。我想這反映了使用像REPLACE這樣的通用函數的成本與更特殊的CAST VARCHAR到MONEY的成本。
美麗!真漂亮。 – 2010-09-15 07:17:59
我剛剛對此解決方案進行了壓力測試,結果令人驚歎! UH-MAZING!只需要1.5秒鐘,就可以使用您的投幣轉換方法將100萬個'NNN,NNN,NNN'數字轉換並存儲在臨時表中。並通過刪除逗號的方法10.6秒。 – 2010-09-15 07:35:58
從( )中選擇最小(mn),最大(mn)完整 與 SELECT MIN(MN),最大值(MN),AVG(MN) 從( 選擇流延(替換(N, '', '')作爲BIGINT)MN 從temp.money )米 - 平均需要10.6秒才能完成 – 2010-09-15 07:36:21
我相信你對這個問題的表現方面都很感興趣。
強制測試鑄造爲貨幣當時的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秒完成!
下面的答案是正確的。但是,如果這是某種應用程序的數據庫,那麼爲什麼不按照即將進入的值(即,當您更新或插入時),只需執行','即可在那裏進行剝離。而不是試圖修復數據,修復它,因爲它進去了。 – RPM1984 2010-09-14 23:39:53
@ RPM1984,好點! – 2010-09-14 23:40:24
嗯,也許我應該把它當作答案。 =) – RPM1984 2010-09-14 23:41:23