订购具有多个点的列varchar。喜欢数字

时间:2018-02-09 16:47:02

标签: sql sql-server

我想要帮助订购专栏(父母),如编号4.1 - > 4.2 - > 4.9 - > 4.10

ColA  ColB  Parent(varchar(max))
             1
             1.1      
             1.22
             2
             2.1
             3
             3.1
             3.1.1
             3.1.2.1
             3.1.2.12
             4.4
             4.4.1
             4.4.10
             4.4.11
             4.4.2
             4.4.3

选择colA,colB,Parent 来自myTable 按父母排序

2 个答案:

答案 0 :(得分:4)

请尝试这个简单的解决方案 -

CREATE TABLE sorts
(
    Parent varchar(max)
)
GO

INSERT INTO sorts VALUES
('1'),
('1.1'),
('1.22'),
('2'),
('2.1'),
('3'),
('3.1'),
('3.1.1'),
('3.1.2.1'),
('3.1.2.12'),
('4.4'),
('4.4.1'),
('4.4.10'),
('4.4.11'),
('4.4.2'),
('4.4.3')
GO
SELECT Parent FROM sorts
ORDER BY CAST('/'+REPLACE(Parent,'.','/')+'/' AS HIERARCHYID)

输出

Parent
-------------------
1
1.1
1.22
2
2.1
3
3.1
3.1.1
3.1.2.1
3.1.2.12
4.4
4.4.1
4.4.2
4.4.3
4.4.10
4.4.11

(16 rows affected)

从这里阅读更多内容 - https://msbiskills.com/2015/10/12/sql-puzzle-sort-data-by-version-puzzle/

答案 1 :(得分:0)

只是为了好玩,这是另一种选择。请注意,如果深度超过4,则无效。

我使用的是Pawan Kumar发布的相同表格。我针对更大的数据集(180万行)运行此操作,两者的性能保持不变。即使执行计划是相同的,我发现相当令人惊讶。

select Parent 
from sorts
order by PARSENAME(Reverse(Parent), 1)
    , PARSENAME(Reverse(Parent), 2)
    , PARSENAME(Reverse(Parent), 3)
    , PARSENAME(Reverse(Parent), 4)