以特定格式分割逗号分隔的字符串

时间:2019-05-22 08:32:54

标签: sql

我有一个表,该表的列表示层次结构路径,因此当我执行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

1 个答案:

答案 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