如何将看起来像数字的任何东西作为T-SQL中的数字进行排序?

时间:2012-02-06 16:04:58

标签: sql sql-server-2008 tsql sql-order-by

我有一个名为Code的列是varchar(3)。

它还包含数字和字符串。例如:' 1', '234', 'Xxx', '9 ','Aa '等。

有没有办法 - 就像在MS EXCEL-ORDER中看起来像数字一样的数字?

所以上面给出的例子的输出将是:

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

2 个答案:

答案 0 :(得分:4)

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

如果字段可以转换为数字,则按数字排序,否则使用ASCII编码进行排序。我使用了“ - 500”,因此排序中没有交叉,并确保数字在文本之前排序。


<强>附录:

Brian Arsuaga已经发布了一个更加强大的解决方案,我实际上更喜欢这个解决方案,但由于这已经被标记为答案,我正在为此添加他的解决方案,以便将来阅读此内容。 / p>

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

答案 1 :(得分:2)

如果你不喜欢使用任意的sentinel(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