在TSQL中对数字进行右对齐的最佳实践是什么?
我必须格式化固定长度的提取文件,并且需要将数字字段右对齐. (我使用的是SQL Server 2005)
我找到了this,这看起来非常简单.
right(' '+convert(varchar(20),a.num),12)
这是完整的Select语句
select
a.num,
fixed_number =
right(' '+convert(varchar(20),a.num),12)
from
(
--Test Data
select num = 2400.00 union all
select num = 385.00 union all
select num = 123454.34
) a
Results:
num fixed_number
---------- ------------
2400.00 2400.00
385.00 385.00
123454.34 123454.34
(3 row(s) affected)
我问这个问题,因为我发现这行代码在工作,看起来INSANELY复杂(它也删除小数和零填充)
CAST(REPLACE(REPLICATE('0', 12 - LEN(REPLACE(CAST(CONVERT(DECIMAL(10,2),@DD8DBAMT) AS VARCHAR),'.','')))
+ CAST(CONVERT(DECIMAL(10,2),@DD8DBAMT) AS VARCHAR),'.','') AS VARCHAR(12))
更新:
Daniel Pratt使用函数的想法让我看了SQL#(我们拥有).它有一个名为PadLeft的函数,令人惊讶的是它具有与Daniel Pratt在下面的答案中定义的fn_PadRight函数相同的参数和功能.
以下是如何使用SQL#函数:
DECLARE @F6D2 AS DECIMAL(8,2)
SET @F6D2 = 0
SQL#.String_PadLeft(@F6D2,9,' ')
SQL#.String_PadLeft(123.400,9,' ')
SQL#.String_PadLeft('abc',9,' ')
它可以同时包含数字和字符串.
最佳答案 我唯一可以建议帮助解决“疯狂的复杂性”是将其封装在一个或多个函数中.这是我们正在使用的某种修改版本:
CREATE FUNCTION [dbo].[fn_PadRight]
(
@Value nvarchar(4000)
,@NewLength int
,@PadChar nchar(1) = ' '
) RETURNS nvarchar(4000)
AS
BEGIN
DECLARE @ValueLength int
SET @ValueLength = LEN(@Value)
IF (@NewLength > @ValueLength) BEGIN
SET @Value = @Value + REPLICATE(@PadChar, @NewLength - @ValueLength)
END
RETURN @Value
END
GO
CREATE FUNCTION [dbo].[fn_FormatAmountDE]
(
@Value money
) RETURNS nvarchar(4000)
AS
BEGIN
RETURN [dbo].[fn_PadRight](REPLACE(CAST(@Value AS varchar), '.', ''), 12, '0')
END
GO