h0m*_*wer 12 sql t-sql sql-server hierarchy
我有一张有田地的桌子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
Run Code Online (Sandbox Code Playgroud)
如何通过以下方式获得以下结果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
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下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)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.','')
ELSE REPLACE(SUBSTRING(SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.',''),1, CHARINDEX('.',SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.',''))),'.','')
END AS FIRST_PART
,CASE WHEN CHARINDEX('.',SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.','')) > 0
THEN SUBSTRING(
SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.','')
,CHARINDEX('.',SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.','')) +1
,LEN( SUBSTRING(LTRIM(RTRIM(NR)),1,LEN(NR)-1)+REPLACE(SUBSTRING(LTRIM(RTRIM(NR)),LEN(NR),1),'.','') )
)
ELSE '0'
END AS SECOND_PART
FROM TEST_TABLE
Run Code Online (Sandbox Code Playgroud)
这是一个更好的方法吗?
试试这个:
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);
Run Code Online (Sandbox Code Playgroud)
您可以检查hierarchyid以获取更多详细信息.检查该ORDER BY
子句只是删除.
值的末尾(如果存在).
您可以像这样IIF
简单地更改功能CASE WHEN
:
SELECT *
FROM @DataSource
ORDER BY CAST('/' + CASE WHEN RIGHT([Value],1) = '.' THEN LEFT([Value], LEN([Value]) - 1) ELSE [Value] END + '/' AS HIERARCHYID);
Run Code Online (Sandbox Code Playgroud)