这是我正在使用的查询:
;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
我该怎么做?
答案 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来订购。