我有2个字符串和一个整数:
@categoryID int = 163,
@Ids nvarchar(2000) = '1,2,3',
@Names nvarchar(2000) = 'Bob,Joe,Alex'
我需要选择3列3行;最成就的是3行2列:
select @categoryID,items from FN_SplitStr(@Ids,',')
结果:
163,1
163,2
163,3
但是我不知道如何拆分两个字符串。
我尝试了很多方法,例如:
select @categoryID,items from FN_SplitStr((@Ids,@Names),',')
select @categoryID,items from FN_SplitStr(@Ids,','),items from FN_SplitStr(@Names,',')
预期的输出:
163,1,Bob
163,2,Joe
163,3,Alex
注意1:我查看了数十个最相似的问题:如何在SQL Server和SQL Server中拆分字符串并将值插入表:将多个字符串分别拆分为一行,但是这个问题有所不同。
注意2: FN_SplitStr是用于在SQL中拆分字符串的函数。而且我正在尝试创建一个存储过程。
根据您的预期输出,您必须使用交叉应用两次,然后创建某种排名,以确保获得正确的价值。由于ID和名称似乎没有任何关系,因此交叉应用会创建多行(将字符串拆分为名称和ID时)
可能有更好的方法,但这也可以提供预期的输出。您可以将此字符串拆分更改为本地函数。
第一个密集等级是为了确保我们得到三个唯一的名称,第二个密集等级是名称内基于ID的顺序的等级,在子查询之外,您必须进行一些比较才能只获得3行。
Declare @categoryID int = 163,
@Ids nvarchar(2000) = '1,2,3',
@Names nvarchar(2000) = 'Bob,Joe,Alex'
select ConcatenatedValue, CategoryID, IDs, Names from (
select concat(@categoryID,',',a.value,',',b.value) ConcatenatedValue, @categoryID CategoryID,
A.value as IDs, b.value as Names , DENSE_RANK() over (order by b.value) as Rn,
DENSE_RANK() over (partition by b.value order by a.value) as Ranked
from string_split(@IDs,',') a
cross apply string_split(@names,',') B ) t
where Rn - Ranked = 0
输出:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句