我正在使用C#和SQL Server 2005.我有一个包含表格编号的数据集,因此我需要对其进行自然排序:
1
10
2
I.1
Table 1
Table 2
Table 10
I.10
I.2
上面是我的数字,我希望它们先排序(1,2,...,10,11),然后按字母排序(I.1,I.2,...,1.10, I.11等)将表1,表2,......,表10,......放在最后。
有没有办法用一些时髦的SQL做到这一点?
(注意:我无法使用C#自然排序功能,因为我无法一次加载整个数据集。)
答案 0 :(得分:-1)
这样的东西可能有效(未经测试,因为我在笔记本电脑上没有使用SQL Server实例):
SELECT *
FROM [tbl]
ORDER BY ISNUMERIC([col]) DESC,
CASE ISNUMERIC([col])
WHEN 1 THEN CAST([col] AS INT)
ELSE [col]
END ASC;
ISNUMERIC
函数如果认为该值是有效数字,则返回1
,所以:
ISNUMERIC([col]) DESC
将数字放在前面CASE ... END
以数字方式对数字进行排序,并按字母顺序对文本值进行排序。您可能需要对此进行微调,但它应该让您从正确的道路开始。
答案 1 :(得分:-1)
试试这个:
declare @a as table (name varchar(100)) insert into @a values ('1') insert into @a values ('10') insert into @a values ('2') insert into @a values ('I.1') insert into @a values ('Table 1') insert into @a values ('Table 2') insert into @a values ('Table 10') insert into @a values ('I.10') insert into @a values ('I.2') select name from ( select top 10 name from ( select top 10 row_number() over (partition by numerics order by numerics desc) sono, numerics, name from ( select isnumeric(name) numerics, name from @a )t )s where numerics = 1 order by convert(decimal, name) ) a union all select name from ( select top 10 name from ( select top 10 row_number() over (partition by numerics order by numerics desc) sono, numerics, name from ( select isnumeric(name) numerics, name from @a )u ) v where numerics = 0 order by name ) b