从数字中删除小数,保留 Sql 服务器中的数千个分隔符



我有一个数字,如:12345.678

我希望它像:12,345(删除其余的!

添加千位分隔符的一种解决方案是:

 select convert(varchar(100), cast(12345.678 as money), 1)

产生 : 12,345.68

现在我应该删除.68

我偶然发现了一个带有解析名称的漂亮解决方案:

 select    parsename(convert(varchar(100), cast(12345.678 as money), 1),2)

产生 : 12,345

问题:这个问题有更好的解决方案吗?(也许不涉及其他函数/字符串操作?

在SQL Server 2008中没有简单的方法可以做到这一点。 SQL Server 2012 引入了 FORMAT 函数,它使您能够执行以下操作:

SELECT FORMAT(12345.67, '#,###')

(尽管这会将数字四舍五入为 12,346)

格式化结果通常不在数据库范围内 - 它应该留给你的前端程序/网站/报告/电子表格等。 但是,如果您确实需要在SQL Server中执行此操作,我怀疑您的解决方案与您将要获得的解决方案一样接近,除非您使用CLR集成从.NET链接到String.Format函数。

如果您确实使用 parseName 使用您的解决方案,请注意它可能不适用于国际(例如,在欧洲部分地区使用 , 作为小数分隔符)。 这对您来说可能不是问题,但如果是,那么您需要一个允许您明确控制格式的解决方案。

Parsename确实是一个创造性的解决方案。 我一直在使用

select replace(convert(varchar,cast(floor(12345.678) as money),1), '.00', '');
--     parsename(convert(varchar,cast(12345.678 as money),1), 2);

虽然它更长。但也许直接替换比解析例程更快?无论如何,从某种意义上说,即使它运行速度快了 21ns,在更大的计划中,你想用这样的问题改进什么?

首先使用 floor() 将其转换为整数:

select convert(varchar(100), cast(floor(12345.68) as money), 1)

我支持理查兹的评论,即这通常是在"演示"层完成的。为什么需要在 SQL Server 中设置此格式?您是否直接在 SQL Server 中查看报表?通常,某人要做的第一件事就是复制并粘贴到Excel中。

无论如何,如果您总是可以将上面的表达式包装在更多字符串函数中:

select replace(
convert(
    varchar(100), 
    cast(floor(12345.68) as money),
    1
),'.00','')

这仍然可能存在错误,同样,我不建议在SQL Server上执行此操作,除非您正在生成类似COBOL的文本报告。

相关内容

  • 没有找到相关文章

最新更新