我有一個名爲Code的列是varchar(3)。我如何在T-SQL中對任何看起來像數字的東西進行排序?
它還包含數字和字符串。例如:' 1', '234', 'Xxx', '9 ','Aa '
等
是否有辦法 - 就像在MS EXCEL-任何東西看起來像一個數字,作爲一個數字?
使輸出對於給定的例子將是:
1. 1
2. 234
3. 9
4. Aa
5. Xxx
我有一個名爲Code的列是varchar(3)。我如何在T-SQL中對任何看起來像數字的東西進行排序?
它還包含數字和字符串。例如:' 1', '234', 'Xxx', '9 ','Aa '
等
是否有辦法 - 就像在MS EXCEL-任何東西看起來像一個數字,作爲一個數字?
使輸出對於給定的例子將是:
1. 1
2. 234
3. 9
4. Aa
5. Xxx
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
我沒有得到-500的觀點。你能詳細說明一下嗎? – pencilCake 2012-02-06 16:11:47
在此處添加關於'ISNUMERIC'的常用警告,以提供意外的結果.... – JNK 2012-02-06 16:13:08
哇!這真的起作用了!:) – pencilCake 2012-02-06 16:20:45
如果你不喜歡使用任意定點(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
+1我更喜歡這個答案。如果我知道我將如何取消我的答案並將其作爲答案,因爲我不知道我是如何在答覆中添加附錄以表明您的更好方法。 – GarethD 2012-02-14 09:03:26
添加一個漂亮的比較嗯。您所需的輸出對我來說看起來像正常的排序順序。 – 2012-02-06 16:06:59
這與您最近的問題有何不同? http://stackoverflow.com/q/9162346/27535右對齊將強制數字排序與字符串之一「11」之前「109」 – gbn 2012-02-06 16:09:38
不幸的是沒有。 Bcoz,當有「109」和「11」時,109在結果中出現在11之前。 – pencilCake 2012-02-06 16:09:58