如何操作 SQL 中的串联列
How to manipulate concatenated columns in SQL
假设我有以下数据集
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,我需要 return 列 LEVEL
中的值用于 1 到 x,然后从虚拟中用于x+1 到 n,所有这些都连接为逗号分隔值,最重要的是全部合并为一个 SQL。这个最大订单可以是任何数字,而且不是固定的。 WX2 缺少递归 CTE,这使得它变得困难。
有什么指点吗?
此函数根据您描述的逻辑连接字符串(测试是 table 的名称和数据):
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
假设我有以下数据集
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,我需要 return 列 LEVEL
中的值用于 1 到 x,然后从虚拟中用于x+1 到 n,所有这些都连接为逗号分隔值,最重要的是全部合并为一个 SQL。这个最大订单可以是任何数字,而且不是固定的。 WX2 缺少递归 CTE,这使得它变得困难。
有什么指点吗?
此函数根据您描述的逻辑连接字符串(测试是 table 的名称和数据):
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