0

在执行包含数字列(例如价格)的 SELECT 语句时,结果总是从左到右排序,这降低了可读性。因此,我正在寻找一种方法来格式化从右到左的数字列的输出。

我已经尝试过使用类似的东西

SELECT ... SPACE(15-LEN(A.Nummer))+A.Nummer ...
   FROM Artikel AS A ...

这给出了接近的结果,但不是真的取决于字体。另一种方法是将 'SPACE()' 替换为 'REPLICATE('_',...)',但我不太喜欢输出中的下划线。

除此之外,这个公式会在位数超过 15 的数字上崩溃,因此我搜索了一种方法来找到条目的最大长度以使其更节省

SELECT ... SPACE(MAX(A.Nummer)-LEN(A.Nummer))+A.Nummer ...
   FROM Artikel AS A ...

但由于 MAX 函数的聚合特性,这不起作用。

那么,为数字列实现右对齐顺序的最佳方法是什么?

谢谢,雷纳

4

1 回答 1

0

要解决列表框的问题,请查看此链接: http: //www.lebans.com/List_Combo.htm 我坚信这种类型的调整应该在 UI 层进行,而不是与数据混合恢复。

但是为了回答你原来的问题,我创建了一个SQL Fiddle

MS SQL Server 2008 架构设置

CREATE TABLE dbo.some_numbers(n INT);

创建一些示例数据:

INSERT INTO dbo.some_numbers
SELECT CHECKSUM(NEWID())
  FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))X(x);

以下查询使用该OVER()子句指定MAX()要应用于所有行。包装结果的>and<仅用于说明目的,而不是解决方案所必需的。

查询 1

SELECT '>'+
       SPACE(MAX(LEN(CAST(n AS VARCHAR(MAX))))OVER()-LEN(CAST(n AS VARCHAR(MAX))))+
       CAST(n AS VARCHAR(MAX))+
       '<'
  FROM dbo.some_numbers SN;

结果

|      COLUMN_0 |
|---------------|
| >-1486993739< |
| > 1620287540< |
| >-1451542215< |
| >-1257364471< |
| > -819471559< |
| >-1364318127< |
| >-1190313739< |
| > 1682890896< |
| >-1050938840< |
| >  484064148< |

这个查询做了一个直接的案例来显示差异:

查询 2

SELECT '>'+CAST(n AS VARCHAR(MAX))+'<'
  FROM dbo.some_numbers SN;

结果

|      COLUMN_0 |
|---------------|
| >-1486993739< |
|  >1620287540< |
| >-1451542215< |
| >-1257364471< |
|  >-819471559< |
| >-1364318127< |
| >-1190313739< |
|  >1682890896< |
| >-1050938840< |
|   >484064148< |

使用此查询,您仍然需要将显示字体更改为等宽字体,例如COURIER NEW. 否则,正如您所注意到的,结果仍然是未对齐的。

于 2013-10-13T16:52:36.480 回答