【发布时间】:2017-09-25 20:08:31
【问题描述】:
我需要使用分隔符将我的一列值拆分为列,下面是表结构。
create table #a
(
id int,
timeline varchar(100)
)
insert into #a
values (1, 'Semi Annual Q2 (May/June/July) & Q4 (Nov/Dec/Jan)'),
(2, 'Semi Annual Q1 (Feb/Mar/Apr) & Q3 (Aug/Sep/Oct)'),
(3, 'Annual Q3 (Aug/Sep/Oct)'),
(4, 'Annual Q2 (May/June/July)'),
(5, 'Annual Q4 (Nov/Dec/Jan)'),
(6, 'Semi Annual Q1 (Jan/Feb/Mar) & Q3 (July/Aug/Sep)')
select * from #a
输出我想用'/'分隔符分割时间线值,并为单独的月份制作单独的列,所有月份都应该按顺序排列,如下面的示例。
ID M1 M2 M3 M4 M5 M6
---------------------------------------
1 May June July Nov Dec Jan
2 Feb Mar Apr Aug Sep Oct
3 Aug Sep Oct NULL NULL NULL
4 May June July NULL NULL NULL
5 Nov Dec Jan NULL NULL NULL
6 Jan Feb Mar July Aug Sep
到目前为止,我已经尝试过:
select
timeline,
substring((substring(timeline, CHARINDEX('(', timeline) + 1, len(timeline) - 1)), 1, charindex('/', substring(timeline, CHARINDEX('(', timeline) + 1, len(timeline) - 1)) - 1) as M1,
replace(replace(right(substring(substring(timeline, CHARINDEX('(', timeline) + 1, len(timeline)), 1, charindex(')', substring(timeline, CHARINDEX('(', timeline) + 1, len(timeline)))), charindex('/', reverse(substring(substring(timeline, CHARINDEX('(', timeline) + 1, len(timeline)), 1, charindex(')', substring(timeline, CHARINDEX('(', timeline) + 1, len(timeline))))), 4)), '/', ''), ')', '') as M3
from
#a;
这不是代码,也太乏味了。如果您有有效的方法,请提供帮助。
【问题讨论】:
-
Jeff Moden 的 DelimitedSplit8K 函数应该可以解决问题...您可以在这里找到它...sqlservercentral.com/articles/Tally+Table/72993
-
我也推荐 Jeff 的分离器。但更重要的是,我建议结束存储分隔数据的做法。它违反了 1NF 并引起了很多痛苦。
标签: sql-server string delimiter