编号交叉应用行

时间:2019-07-02 12:30:10

标签: sql sql-server sql-server-2014

我想对使用交叉应用创建的行进行编号。 可以说我有一张这样的桌子

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  

但是我不知道如何实现这一目标。同样,“数量”应与订购有关。有什么提示吗?有建议吗?

谢谢!

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。