sql server:可以将1,123转换为数字吗?

时间:2010-09-14 23:30:37

标签: sql sql-server

我有一个varchar字段,字符串存储为"1,223""23,342,234"

他们有昏迷!

可以将它们读作numbers吗?

我不喜欢这些答案中的任何一个。在mysql中读取varchar 1,123并将其转换为数字是没有问题的。

7 个答案:

答案 0 :(得分:6)

您可以通过MONEY数据类型:

CAST( CAST( value AS MONEY ) AS INT )

将VARCHAR转换为MONEY时,千位分隔符 allowed。此外,允许从MONEY到其他数字类型的隐式转换,因此您可以使用

CAST( value AS MONEY )

看到相对表现可能会很有趣,但我会惊讶地看到很多不同。 但是......可能取决于您的目标数据类型 - 对于通过MONEY传输的整数类型可能会很昂贵。

更新

嗯,这与我的预期有所不同 - 请参阅丹尼斯的回答。我想这反映了使用像REPLACE这样的通用函数与更专业的VARCHAR到MONEY的CAST相比的成本。

答案 1 :(得分:4)

只需用任何内容替换任何逗号并将其转换为int:

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

答案 2 :(得分:3)

如果现有的select语句如下所示:

select field1 from table

您可以使用此代码将filed1转换为数字:

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

答案 3 :(得分:2)

select Cast(Replace(myfield, ",","") as int)

答案 4 :(得分:2)

删除逗号并进行演员:

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

答案 5 :(得分:1)

我确信你们都对这个问题的表现方面感兴趣。

对cast-as-money-then-as-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秒才能完成!

答案 6 :(得分:0)

取决于Windows区域配置设置AFAIK。