当执行包含数字列(例如价格)的 SELECT 语句时,结果始终从左到右排序,这会降低可读性。因此,我正在寻找一种从右到左格式化数字列输出的方法。
我已经尝试使用类似的东西
SELECT ... SPACE(15-LEN(A.Nummer))+A.Nummer ...
FROM Artikel AS A ...
这给出了接近的结果,但取决于字体并不是真的。另一种方法是将"SPACE()"替换为"REPLICA("_,...)",但我不太喜欢输出中的下划线。
除此之外,这个公式会在数字超过 15 的数字上崩溃,因此我寻找一种方法来查找条目的最大长度以使其更省钱
SELECT ... SPACE(MAX(A.Nummer)-LEN(A.Nummer))+A.Nummer ...
FROM Artikel AS A ...
但由于 MAX 函数的聚合特性,这不起作用。
那么,实现数字列右对齐顺序的最佳方法是什么?
谢谢雷纳
要解决列表框的问题,请查看此链接: http://www.lebans.com/List_Combo.htm我坚信这种类型的调整应该在 UI 层进行,而不是与数据检索混合在一起。
但是为了回答你最初的问题,我创建了一个SQL小提琴:
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()
。包装结果的>
和<
仅用于说明目的,不是解决方案所必需的。
查询 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
。否则,正如您所注意到的,结果仍然未对齐。