我有一个名为Code的列是varchar(3)。
它还包含数字和字符串。例如:' 1', '234', 'Xxx', '9 ','Aa '
等。
有没有办法 - 就像在MS EXCEL-ORDER中看起来像数字一样的数字?
所以上面给出的例子的输出将是:
1. 1
2. 234
3. 9
4. Aa
5. Xxx
答案 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