说我有以下数据集
WITH dataset (hno,sorder,level,dummy,maxorder) AS
(
SELECT 1, 1, 'val1', 'NULL1', 5 FROM dual UNION ALL
SELECT 1, 2, 'val2', 'NULL2', 5 FROM dual UNION ALL
SELECT 1, 3, 'val3', 'NULL3', 5 FROM dual UNION ALL
SELECT 1, 4, 'val4', 'NULL4', 5 FROM dual UNION ALL
SELECT 1, 5, 'val5', 'NULL5', 5 FROM dual)
SELECT *
FROM dataset;
HNO SORDER LEVEL DUMMY MAXORDER
1 4 val4 NULL4 5
1 2 val2 NULL2 5
1 3 val3 NULL3 5
1 1 val1 NULL1 5
1 5 val5 NULL5 5
我需要另一个名为TEXT
HNO SORDER LEVEL DUMMY MAXORDER TEXT
1 4 val4 NULL4 5 val1,val2,val3,val4,NULL5
1 2 val2 NULL2 5 val1,val2,NULL3,NULL4,NULL5
1 3 val3 NULL3 5 val1,val2,val3,NULL4,NULL5
1 1 val1 NULL1 5 val1,NULL2,NULL3,NULL4,NULL5
1 5 val5 NULL5 5 val1,val2,val3,val4,val5
这个想法是为SQL操纵动态占位符。因此,如果排序顺序是介于1 ... n之间的范围,那么对于SORDER
值x,我需要将列LEVEL
中的值从1返回到x,然后从虚拟中返回x + 1到n和所有这些连接为逗号分隔值,最重要的是在一个SQL中。此最大订单可以是任何数字,并且不是固定的。 WX2缺乏递归CTE,这使得它变得困难。
任何指针?
答案 0 :(得分:0)
此函数根据您描述的逻辑连接字符串(test是包含数据的表的名称):
CREATE FUNCTION Concatenate_string
(
@sorder int
)
RETURNS varchar(1000)
AS
BEGIN
-- Declare the return variable here
DECLARE @result varchar(1000)=''
declare @i int=1
while @i<=(select max(sorder) from test)
begin
set @result=@result + (select case when @i <= @sorder then level else dummy end+',' from test where sorder=@i)
set @i=@i+1
end
return @result
END
GO