SQL Server 2005中的自然排序

时间:2011-12-16 23:21:33

标签: sql sql-server sql-server-2005

我正在使用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#自然排序功能,因为我无法一次加载整个数据集。)

2 个答案:

答案 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