2012-02-06 18 views
-1

我有一個名爲Code的列是varchar(3)。我如何在T-SQL中對任何看起來像數字的東西進行排序?

它還包含數字和字符串。例如:' 1', '234', 'Xxx', '9 ','Aa '

是否有辦法 - 就像在MS EXCEL-任何東西看起來像一個數字,作爲一個數字?

使輸出對於給定的例子將是:

1. 1 
2. 234 
3. 9 
4. Aa 
5. Xxx 
+0

添加一個漂亮的比較嗯。您所需的輸出對我來說看起來像正常的排序順序。 – 2012-02-06 16:06:59

+0

這與您最近的問題有何不同? http://stackoverflow.com/q/9162346/27535右對齊將強制數字排序與字符串之一「11」之前「109」 – gbn 2012-02-06 16:09:38

+0

不幸的是沒有。 Bcoz,當有「109」和「11」時,109在結果中出現在11之前。 – pencilCake 2012-02-06 16:09:58

回答

4
ORDER BY CASE WHEN ISNUMERIC(YourField) = 1 THEN CONVERT(INT, YourField) - 500 ELSE ASCII(LOWER(YourField)) END 

如果該字段可以被轉換爲數字它是由數排序否則它使用ASCII編碼來排序。我已經使用了「 - 500」,這樣就不會出現交叉,並且確保數字在文本之前排序。


附錄:

Brian Arsuaga發佈了一個更強大的解決方案,這裏面其實我更喜歡,但因爲這已經被標記爲我加入他的解決方案,以本作的利益答案任何人在將來閱讀此內容。

ORDER BY 
     ISNUMERIC(YourField) DESC, 
     CASE WHEN ISNUMERIC(YourField) = 1 THEN CONVERT(INT, YourField) ELSE 0 END, 
     YourField 
+0

我沒有得到-500的觀點。你能詳細說明一下嗎? – pencilCake 2012-02-06 16:11:47

+1

在此處添加關於'ISNUMERIC'的常用警告,以提供意外的結果.... – JNK 2012-02-06 16:13:08

+0

哇!這真的起作用了!:) – pencilCake 2012-02-06 16:20:45

2

如果你不喜歡使用任意定點(500),這可能會導致排序取決於數字的你所期望的範圍內的問題,您可以使用多個表達式的順序。

-- put the numbers at the top 
ORDER BY ISNUMERIC(YourField) DESC, 
     -- sort the numbers as numbers, sort the strings as nothing 
     CONVERT(INT, CASE WHEN ISNUMERIC(YourField) = 1 THEN YourField ELSE '0' END), 
     -- sort the strings 
     YourField 

最後一項是唯一的決勝局當任兩個術語是具有相同值的兩個數字(「01」,「1」)或兩個術語都是非數字。對於非數字,他們的第一和第二項將始終爲0.

更復雜,但也許更安全一點。

編輯與傢伙的幫助下

create table #t 
(
    YourField varchar(4) 
) 
insert into #t(YourField) Values('1'), ('3'), ('234'), ('0'), ('00'), 
    ('09'), ('9'), ('1a'), ('aaa'), ('aba'), ('-500') 

Select YourField from #t 

    ORDER BY ISNUMERIC(YourField) DESC, 
      CONVERT(INT, CASE WHEN ISNUMERIC(YourField) = 1 THEN YourField ELSE '0' END), 
      YourField 

drop table #t 

example results

+0

+1我更喜歡這個答案。如果我知道我將如何取消我的答案並將其作爲答案,因爲我不知道我是如何在答覆中添加附錄以表明您的更好方法。 – GarethD 2012-02-14 09:03:26

相關問題