SQL varchar 类型的服务器列有点和破折号 - 在右侧转换为十进制

SQL Server column of type varchar has dot and dash - on right side convert into Decimal

我有一个字符串列,其样本数据如下:

14.377.616
29.264.814
16.892.140
6.410.850-

我希望输出是这样的:

14377616.0000
29264814.0000
16892140.0000
-6410850.0000

该列必须转换为十进制。我有这样的查询:

CASE 
    WHEN Column LIKE '%-%' 
        THEN REPLACE(REPLACE(Column, '-', ''), '.', '')
    WHEN Column LIKE '%-%' 
        THEN Column * -1
    ELSE CONVERT(decimal(20, 4), REPLACE([Column], '.', ''))
END 

但结果负数无法在左侧显示破折号(但破折号消失了),如下所示:

14377616.0000
29264814.0000
16892140.0000
6410850.0000

提前致谢

我会这样做:

with CastedTable (MyColumn)
as
(
  select replace([Column],'.','') DecimalValue
  from MyTable
)
select 
  case 
  when MyColumn like '%-%' then cast('-' + replace(MyColumn, '-', '') as decimal(20, 4))
  else cast(MyColumn as decimal(20, 4)) end
from CastedTable

结果:

14377616
29264814
16892140
-6410850

SQL Fiddle: http://sqlfiddle.com/#!18/decccb/8

就是说,如果您想使用您的查询,那就是:

select  CASE 
  WHEN [Column] like '%-%' THEN CONVERT(decimal(20,4),REPLACE(REPLACE([Column],'-',''),'.','')) * -1
  ELSE CONVERT(decimal(20,4),REPLACE([Column],'.','')) END AS [Column]

您可以使用 right() 获取 + 或 - 并使用 replace() 替换点,如下所示

注意: '13123.123123' -> colname

select 
 CASE WHEN  RIGHT ( '13123.123123' , 1) <> '-' THEN
 CAST ( REPLACE('13123.123123','.','') AS decimal)
 ELSE
  CAST ( REPLACE('13123.123123','.','') AS decimal) * -1
  END