Sql server 如何将字符串的每个元素提取到单独的列中?
我的桌子像:Sql server 如何将字符串的每个元素提取到单独的列中?,sql-server,tsql,Sql Server,Tsql,我的桌子像: |----|----------------|--------------------------|----------------------| | id | tickets | comb1 | comb2 | |---------------------|--------------------------|----------------------| | 1 | 3146000011086.
|----|----------------|--------------------------|----------------------|
| id | tickets | comb1 | comb2 |
|---------------------|--------------------------|----------------------|
| 1 | 3146000011086..| ,13, ,31, ,50,66,77,..| ,22,38,40, , .. |
|---------------------|--------------------------|----------------------|
|2..n| 314600001924...| 5,14,23, , ,50, , ,..| 4,12,21, ,47, ,.. |
|-----------------------------------------------------------------------|
我需要将comb1和comb2中的每个元素提取到如下列:
|---------------------|------------------|------------------|---------------|
| val_of_comb1(1) | val_of_comb1(2) | ..val_of_comb2(1)|val_of_comb2(2)|
|---------------------|------------------|------------------|---------------|
| | 13 | | 22 |
|---------------------|------------------|------------------|---------------|
| 5 | 14 | .. 4 | 12 |
|---------------------|------------------|------------------|---------------|
也许用循环取出每个元素?(但如果我有很多记录它将如何影响数据库)欢迎任何想法a.交叉应用
,透视
,和字符串分割
这里是一个版本,如果Comb1拆分为12个字符串
drop table X
create table X
(
id int,
comb1 nvarchar(max)
);
insert into X values (1,',13, ,31, ,50,66,77,..');
insert into X values (2,'5,14,23, , ,50, , ,..');
-- From https://stackoverflow.com/questions/12195504/splitting-a-string-then-pivoting-result by Kannan Kandasamy
select * from (
select * from X x cross apply (select RowN=Row_Number() over (Order by (SELECT NULL)), value from string_split(x.Comb1, ',') ) d) src
pivot (max(value) for src.RowN in([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) as p
B.只需字符串和代码
一个选项是使用STRING\u SPLIT
,它将返回行
select value from STRING_SPLIT(',13, ,31, ,50,66,77,..',',');
然后可以收集代码中的所有行,并将它们收集为一个数组。A.交叉应用
,透视
,以及字符串分割
这里是一个版本,如果Comb1拆分为12个字符串
drop table X
create table X
(
id int,
comb1 nvarchar(max)
);
insert into X values (1,',13, ,31, ,50,66,77,..');
insert into X values (2,'5,14,23, , ,50, , ,..');
-- From https://stackoverflow.com/questions/12195504/splitting-a-string-then-pivoting-result by Kannan Kandasamy
select * from (
select * from X x cross apply (select RowN=Row_Number() over (Order by (SELECT NULL)), value from string_split(x.Comb1, ',') ) d) src
pivot (max(value) for src.RowN in([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) as p
B.只需字符串和代码
一个选项是使用STRING\u SPLIT
,它将返回行
select value from STRING_SPLIT(',13, ,31, ,50,66,77,..',',');
然后,您可以收集代码中的所有行,并将它们收集为一个数组。什么版本的sql server?根据您使用的sql server版本,如果您使用pl/sql并将其推送到db server,则可以使用STRING_split来操作db,这将是最有效的方法,因为这需要最少的数据传输。如果您不擅长sql,那么在应用程序开发代码中使用for循环来处理此问题会更容易,但这确实是一种选择。该方法将取决于您是希望将此更改持久化到数据库本身中,还是仅在应用程序代码级别需要它。关于确切的解决方案,请参考:每个
梳是否有最大元素数?@Caius Jard MS SQL 14.0.17199.0(管理v17.3)什么版本的sql server?根据您正在使用的sql server版本,如果您使用pl/sql并将其推送到db server来操作db,则可以使用STRING_Split,这将是最有效的方法,因为这需要最少的数据传输。如果您不擅长sql,那么在应用程序开发代码中使用for循环来处理此问题会更容易,但这确实是一种选择。该方法将取决于您是希望将此更改持久化到数据库本身中,还是仅在应用程序代码级别需要它。关于确切的解决方案,请参考:每个梳是否有最大元素数?@Caius Jard MS SQL 14.0.17199.0(管理v17.3)谢谢,先生,这正是我需要的@谢谢你,先生,这正是我需要的@鼓室