3

我一直致力于生成一个以句点分隔的整数层次结构,该层次结构通过选择查询执行“自然”顺序。我试了一下,下面的查询被吹捧为十进制排序的解决方案:

select id
from tablenm
order by
    case isnumeric(id + 'e0') 
        when 1 then 0 
        else 1 
    end,
    id

但是,从技术上讲,我并不是在所有情况下都使用小数,所以我只取得了一些有限的成功。请注意,此层次结构中可能有多个级别 - 为了简洁起见,我在示例中仅显示了三个级别。

上面的 SQL 产生以下输出:

id
1
1.1
5
5.1
5.10
5.2
1.5.1
4.2.1
1.3.1
3.2.1

我需要它看起来像:

id
1
1.1
1.3.1
1.5.1
3.2.1
4.2.1
5
5.1
5.2
5.10

感谢您提供的任何见解。

4

2 回答 2

3

我会尝试以下答案https://stackoverflow.com/a/6541020/638400

注意我不能把这个答案归功于 - SQL 非常特殊

于 2013-08-16T09:22:08.653 回答
1

这是我为那些偶然发现同样困境的人准备的最后一条 SQL:

declare @xml xml,
        @max_len int

set @xml =
(
    select  
        id
        ,cast('<i>' + replace(id,'.','</i><i>') + '</i>' as xml)
    from tablenm
    for xml path('id_root'), type
)    

select @max_len = max(len(x.i.value('.','nvarchar(10)')))
from @xml.nodes('/id_root/i') x(i)

select id 
from tablenm
cross apply(
    select 
        case 
            when isnumeric(x.i.value('.','nvarchar(10)')) = 1 
            then right(replicate('0',@max_len) + x.i.value('.','nvarchar(10)'),@max_len) 
            else x.i.value('.','nvarchar(10)') 
        end + '.'
    from @xml.nodes('/id_root/i') x(i)
    where x.i.value('../id[1]','nvarchar(50)') = tablenm.id
    for xml path('')
) as srt(srtvalue)
order by srt.srtvalue
于 2013-08-16T09:32:15.317 回答