2011-10-10 69 views
1

我有具有将稍后在导入过程被转化成decimal(9,3)数据的列[Cash] nvarchar(50),一些数据与正常外观数值如134.630,-80.662一致324.372。偶尔我有多个点的数字值的数据,如1.324.372 and -2.134.630.有没有办法去除这个额外的点。转换为有效的十进制数据类型

+1

不''-2.134.630.''有在最后一个点一样好,甚至是一个句号? –

+0

所以,数字分组符号是'.'。什么是小数点分隔符? –

+1

您可以更确切地指定行为吗?例如,所有的值都有3位小数。正如所写,实际上并不清楚数字*应该是...... – MatBailie

回答

1
declare @yourtable table(cash varchar(20)) 
insert @yourtable values('1.324.372') 
insert @yourtable values('-2.134.630') 
insert @yourtable values('1.234.567.89') 

旧代码:

select reverse(replace(replace(stuff(reverse(cash), charindex(
    '.', reverse(cash)), 1, ','), '.', ''), ',', '.')) 
from @yourtable 

稍微升级代码(结果是一样的):

select reverse(stuff(reverse(replace(cash, '.', '')), 
    charindex('.', reverse(cash)), 1, '.')) 
from @yourtable 

结果:

1324.372 
-2134.630 
1234567.89 
+0

辉煌的成果。感谢您的帮助 –

1

你可以;

select case when len(cash) - len(replace(cash, '.', '')) > 1 then 
    reverse(stuff(reverse(cash), charindex('.', reverse(cash)), 1, '')) 
else  
    cash 
end 
from T 
+0

这是我最初尝试的 –

0

创建包含具有适当值的计算字段的视图。

这样你仍然可以看到varchar值和相应的十进制值。

像这样:

选择 [现金], 铸造(替换([现金], '')为十进制 '')从....

为[CashDecimal]