在 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)
我问这个问题是因为我在工作中发现了这行代码,它看起来非常复杂(它还删除了小数和零填充)
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,' ')
它可以接受数字和字符串。
最佳答案
您不喜欢我的回答,但最佳做法是在 SQL 以外的其他地方执行此操作。 SQL 旨在存储检索和处理数据,而不是将其可视化。不格式化显示。恕我直言,如果有一个控制台应用程序可以提取数据然后生成文件,那会好得多。
但是,当我之前这样做时,我是这样做的:
declare @num int
set @num=1555
select replicate(' ',20-len(cast(@num as varchar))) + cast(@num as varchar)
硬编码空间太糟糕了,这可能会因为大量而中断,但是如果您生成固定文件,您无论如何都会为大量生成垃圾
编辑
Ken 我确实阅读了 ops 帖子,是的,他正在将数据格式化为固定宽度的文件。关键是您应该在应用程序层中进行格式化,而不是在 SQL 中。是的,没有人在视觉上查看数据,但我想我觉得您仍在格式化数据,我们可能正在 split 。
关于sql - 在 SQL 中右对齐数字的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/655841/