在SQL中排序层级文本

前端之家收集整理的这篇文章主要介绍了在SQL中排序层级文本前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个带有varchar字段的表.此字段存储我要订购的分层数字.

以下是我的数据示例:

1
1.1
1.1.1
1.1.2
1.1.3.
1.1.4
1.1.5
1.1.6.
1.1.7
10.
10.1
10.2
10.3
11.
11.1
11.2
2.
2.1
1.2.2
1.2.2.1
1.2.2.2

如何使用T-sql实现以下结果:

1
1.1
1.1.1
1.1.2
1.1.3
1.1.4
1.1.5
1.1.6
1.1.7
1.2.2
1.2.2.1
1.2.2.2
2.
2.1
10.
10.1
10.2
10.3
11.
11.1
11.2

我试图用下面的sql来拆分这些部分,但是这并不优雅.

SELECT CASE WHEN CHARINDEX('.',SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.',''))  = 0
  THEN SUBSTRING(LTRIM(RTRIM(NR)),'') 
  ELSE REPLACE(SUBSTRING(SUBSTRING(LTRIM(RTRIM(NR)),''),CHARINDEX('.',''))),'')
  END AS FIRST_PART,CASE WHEN CHARINDEX('.',''))  > 0
      THEN SUBSTRING( 
SUBSTRING(LTRIM(RTRIM(NR)),'')) +1,LEN( SUBSTRING(LTRIM(RTRIM(NR)),'')  )
   )
  ELSE '0'
  END AS SECOND_PART
FROM TEST_TABLE

theree是更好的方法吗?

解决方法

尝试这个:
DECLARE @DataSource TABLE
(
    [Value] VARCHAR(12)
);

INSERT INTO @DataSource ([Value])
VALUES ('1'),('1.1'),('1.1.1'),('1.1.2'),('1.1.3.'),('1.1.4'),('1.1.5'),('1.1.6.'),('1.1.7'),('10.'),('10.1'),('10.2'),('10.3'),('11.'),('11.1'),('11.2'),('2.'),('2.1'),('1.2.2'),('1.2.2.1'),('1.2.2.2');

SELECT *
FROM @DataSource
ORDER BY CAST('/' + IIF(RIGHT([Value],1) = '.',LEFT([Value],LEN([Value]) - 1),[Value]) + '/' AS HIERARCHYID);

您可以查看hierarchyid了解更多详情.检查ORDER BY子句只是删除.在值的结尾(如果存在).

您可以使用简单的CASE更改IIF功能,如下所示:

SELECT *
FROM @DataSource
ORDER BY CAST('/' + CASE WHEN  RIGHT([Value],1) = '.' THEN LEFT([Value],LEN([Value]) - 1) ELSE [Value] END + '/' AS HIERARCHYID);

猜你在找的MsSQL相关文章