我想对使用交叉应用创建的行进行编号。 可以说我有一张这样的桌子
key|value
---+-----
1 | A
2 | B
我跑
select * from t CROSS apply String_Split('x,y', ',')
Id喜欢获得该结果:
key|value|value|number
---+-----+-----+--------
1 | A | x | 1
1 | A | y | 2
2 | B | x | 1
2 | B | y | 2
但是我不知道如何实现这一目标。同样,“数量”应与订购有关。有什么提示吗?有建议吗?
谢谢!
答案 0 :(得分:4)
如果2016年以后,另一个选择是使用JSON KEY。如果需要的话,在KEY上+1是小问题
示例
Declare @YourTable Table ([id] int,[value] varchar(50))
Insert Into @YourTable Values
(1,'A')
,(2,'B')
Select A.*
,B.*
From @YourTable
Cross Apply (
SELECT [Key]
,[value]
FROM OPENJSON('["'+replace('x,y',',','","')+'"]')
) B
返回
id value Key value
1 A 0 x
1 A 1 y
2 B 0 x
2 B 1 y
EDIT XML / 2014版本
Select A.*
,B.*
From @YourTable A
Cross Apply (
Select RetSeq = row_number() over (order by 1/0)
,RetVal = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace('x,y',',','</x><x>')+'</x>' as xml)) as A
Cross Apply x.nodes('x') AS B(i)
) B
答案 1 :(得分:1)
您也可以使用CTE。在CTE上,我使用row_number()在常量上添加了字符串部件号(因此它不会按任何列排序,并以原始自然顺序生成数字)。
with string_values as (
select row_number() over (order by (select 0)) as number,
value
from string_split('X,Y', ',')
)
select * from t cross join string_values
PS:搜索SQL拆分字符串,您会发现很多函数可以替换SQL Server 2014中的split_string。