按原始顺序排序字符串

时间:2014-01-14 03:22:38

标签: sql-server sql-server-2008

这是我正在使用的查询:

;WITH list (Value) AS
(
SELECT Value
        FROM (
        SELECT Value
        FROM fn_SplitString('Quick Brown Fox',' ')
        ) a
), cte AS
(
    SELECT Value
    FROM list
    UNION ALL
    SELECT two.Value + ' ' + one.Value 
    FROM cte AS one, list AS two
    WHERE two.Value > one.Value
)
SELECT *
FROM cte

输出将是

Quick
Brown
Fox
Quick Fox
Quick Brown
Fox Brown
Quick Fox Brown

fn_SplitString 会创建一个这样的表格。它会将所有用空格分隔的单词拆分成行。

Quick
Brown
Fox

我已经尝试使用ROW_NUMBER() OVER(ORDER BY GETDATE())来反转它,这将是 fn_SplitString 的输出。但总体输出仍然是相同的。

Fox 
Brown 
Quick

上面的查询对每行的单词/字母按字母顺序(反向)进行排序,我需要的输出不按字母顺序排序,或者如下例所示。

预期输出

Quick
Brown
Fox
Quick Brown
Quick Fox
Brown Fox
Quick Brown Fox

Quick Brown Fox
Quick Brown
Quick Fox
Brown Fox
Quick
Brown
Fox

我该怎么做?

1 个答案:

答案 0 :(得分:0)

最好修改fn_SplitString以返回索引器或切换到使用返回一个(example)的不同拆分字符串函数,但在任何一种情况下都需要获取来自该解析操作的排序索引

编辑:如果没有像damien所评论的明确的ORDER BY,下面插入@Stage的顺序是不可靠的。我会在这里留下例子,但它不符合OP的目的:

declare @stage table (i int identity(1,1) primary key, value varchar(max));
insert into @stage (value)
    select Value from dbo.fn_SplitString('Quick Brown Fox',' ');

;WITH list (i, Value) AS
(
    SELECT [i] = cast(i as varchar(10)), Value
    FROM @stage
), cte (i, value) AS 
(
    SELECT  cast(i as varchar(10)), 
            Value
    FROM list AS wan
    UNION ALL
    SELECT  cast(two.i + '/' + one.i as varchar(10)), 
            two.Value + ' ' + one.Value 
    FROM cte AS one, list AS two
    WHERE two.Value > one.Value
)
SELECT *
FROM cte
order by len(i), i;

在这里,我将“i”构建为节点路径(“1/2/3”),以说明CTE中正在进行的操作。你当然可以使用i来订购。