sql - 在 SQL 中右对齐数字的最佳实践

标签 sql sql-server tsql

在 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/

相关文章:

sql-server - 仅更改 SQL 中 datetimeoffset 的时间部分

sql-server - sql 计数总和

sql-server - 联合/联合所有查询中的别名 - SQL Server

mysql - 如何查询带有可能未输入参数的对象列表?

java - 如何将一个 Set 插入到 integer[] 类型的列中?

sql - 提高查询速度

sql - Select into View 中的语句

sql - 如何有效地选择所有重复项

sql-server - SQL - SUM-CASE-除以零错误

sql - MSSQL 中的 INSERT 触发器 : destination table by Variable