2013-10-13 45 views
0

執行包括數字列(例如price)的SELECT語句時,結果總是從左到右排列,這會降低可讀性。因此,我正在搜索一種方法來從右向左格式化數字列的輸出。如何在sql服務器中從右到左排列數字SELECT語句

我已經嘗試過使用類似

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

這給接近的結果,但根據字體不是真的。另一種方法是用'REPLICATE('_',...)'替換'SPACE()',但我不太喜歡輸出中的下劃線。

除此之外,該公式將在數崩潰與超過15位,因此我搜索的方式找到條目的最大長度,使之更加節省像

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

但這並不因工作MAX函數的集合字符。

那麼,實現右對齊 order-number-columns的最佳方式是什麼?

感謝, 賴

+0

你現在如何顯示你的查詢結果,他們「總是按照從左到右的順序排列」? –

+0

聽起來你想在你的用戶界面中使用右對齊的文本。 –

+0

好吧,'正確的文字'將更適合描述我渴望的結果 - 但只能在數字列中... –

回答

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()將被應用於所有行。結果所包含的><僅用於說明目的,並不是解決方案所必需的。

查詢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; 

Results

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

此查詢確實的直殼體以示區別:

查詢2

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

Results

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

有了這個查詢,你仍然需要顯示字體更改爲等寬字體像COURIER NEW。否則,正如你所注意到的,結果仍然是錯位的。

+0

哇,塞巴斯蒂安,這是令人印象深刻的......;)'OVER()'使不同 - 事件雖然目前我並不完全瞭解它在這種情況下的作用。無論如何,只要我不使用等寬字符集,現在我可以在一組(左對齊)文本列中產生一個'幾乎右對齊'的數字列。 –

+0

沒有預料到這樣的答案了,所以當我今天回到這個網站時我非常驚訝......非常感謝! –

+0

很高興我能幫到你。你介意把這個標記爲例外答案嗎? :) –