我有一个表,该表的列表示层次结构路径,因此当我执行SQL查询时
select hierachypath from mytable where id=10
对于特定的行,我将得到这样的结果
hieracheypath
--------------
1,2,3,4,5,6,7,8,9,10
select hierachypath from mytable where id=10
我想要得到类似
的结果1,2,3,4,5,6,7,8,9,10
1,1,2,3,4,5,6,7,8,9
1,2,3,4,5,6,7,8
1,2,3,4,5,6,7
1,2,3,4,5,6
1,2,3,4,5
1,2,3,4
1,2,3
1,2
1
OR
1
1,2
1,2,3
1,2,3,4
1,2,3,4,5
1,2,3,4,5,6
1,2,3,4,5,6,7
1,2,3,4,5,6,7,8
1,2,3,4,5,6,7,8,9
1,2,3,4,5,6,7,8,9,10
我曾经尝试过
Declare @heiracheypath nvarchar(4000) ='1,2,3,4,5,6,7,8,9,10'
declare @Result TABLE (Column1 VARCHAR(100))
Declare @tcount int
SELECT @tcount=(len(@heiracheypath) - LEN(REPLACE(@heiracheypath,',','')) + 1)
DECLARE @IntLocation INT
WHILE (CHARINDEX(',', @heiracheypath, 0) > 0)
BEGIN
SET @IntLocation = CHARINDEX(',', @heiracheypath, 0)
INSERT INTO @Result (Column1)
--LTRIM and RTRIM to ensure blank spaces are removed
SELECT RTRIM(LTRIM(SUBSTRING(@heiracheypath, 0, @IntLocation)))
SET @heiracheypath = STUFF(@heiracheypath, 1, @IntLocation, '')
END
INSERT INTO @Result (Column1)
SELECT RTRIM(LTRIM(@heiracheypath))--LTRIM and RTRIM to ensure blank spaces are removed
select * from @Result
但结果是
Column1
-------
1
2
3
4
5
6
7
8
9
10
答案 0 :(得分:1)
问题中的代码看起来像T-SQL-因此,这是一个没有通用表表达式的简单解决方案:
DECLARE @heiracheypath nvarchar(4000) ='1,2,3,4,5,6,7,8,9,10';
SELECT SUBSTRING(@heiracheypath, 1, ci-1) As Paths
FROM
(
SELECT CHARINDEX(',',@heiracheypath, N) As ci
FROM
(
SELECT TOP(LEN(@heiracheypath)) ROW_NUMBER() OVER(ORDER BY @@SPID) As N
FROM sys.objects A
) AS Tally
UNION
SELECT LEN(@heiracheypath) + 1
) As CommaIndexes
WHERE ci > 0
ORDER BY ci
派生的Tally
表包含从1到值的长度的数字,
CommaIndexes
表包含值中每个逗号的不同索引,
union
部分还将返回完整的字符串,
而最外层的select语句只需使用substring
即可返回字符串的相关部分。
可以通过将统计提示表与commaIndexs导出表组合来进一步简化此操作:
SELECT SUBSTRING(@heiracheypath, 1, ci-1) As Paths
FROM
(
SELECT TOP(LEN(@heiracheypath)) CHARINDEX(',',@heiracheypath, ROW_NUMBER() OVER(ORDER BY @@SPID)) As ci
FROM sys.objects A
UNION SELECT LEN(@heiracheypath) + 1
) As CommaIndexes
WHERE ci > 0
ORDER BY ci
结果:
Paths
1
1,2
1,2,3
1,2,3,4
1,2,3,4,5
1,2,3,4,5,6
1,2,3,4,5,6,7
1,2,3,4,5,6,7,8
1,2,3,4,5,6,7,8,9
1,2,3,4,5,6,7,8,9,10