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

我有一个字段是一个varchar和字符串存储为"1,223""23,342,234"sql server:是否可以将1,123转换为数字?

他们有昏迷!

是否可以将它们读取为numbers

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

回答:

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

回答:

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

回答:

就什么也没有更换任何逗号和强制转换为一个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的成本。

回答:

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

强制测试铸造为货币当时的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秒完成!

以上是 sql server:是否可以将1,123转换为数字? 的全部内容, 来源链接: utcz.com/qa/260339.html

回到顶部