首页 > 解决方案 > varchar 类型的 SQL Server 列具有点和破折号 - 右侧转换为十进制

问题描述

我有一个字符串列,其中示例数据如下:

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 

但结果负数不能在 LEFT 中显示破折号(但破折号消失了),如下所示:

14377616.0000
29264814.0000
16892140.0000
6410850.0000

提前致谢

标签: sql-servertype-conversion

解决方案


我会这样做:

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小提琴: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]

推荐阅读