我的列中包含月份名称以及特定月份名称后的其他文本。我想要做的是从该列中提取月份并创建一个名为Month的新列。
|Ops/SLA Month |
|APRIL SLA Reporting|
|APRIL OPS Reporting|
这个专栏从4月到3月继续进行,这意味着我不能使用子字符串,因为月份有不同的字符长度。有没有办法可以编写一个case语句或一个将该列拆分为两列的查询?预期结果如下:
|Months |OPS/SLA |
|April |SLA Reporting|
|April |OPS Reporting|
答案 0 :(得分:3)
您可以尝试下面的查询
create table tbl ([Ops/SLA Month] varchar(max));
insert into tbl values
('APRIL SLA Reporting')
,('APRIL OPS Reporting');
select
month = m.month,
[OPS/SLA]= substring(t.[Ops/SLA Month],LEN(m.month)+1,8000)
from tbl t cross join
(values
('January'),('February'),('March'),
('April'),('may'),('june'),
('july'),('August'),('September'),
('October'),('November'),('December'))m(month)
where t.[Ops/SLA Month] like m.month +'%'
的 working demo 强>
答案 1 :(得分:0)
试试这个
insert into <table_name1>
select
case when CHARINDEX(' ',[Ops/SLA Month])>0
then SUBSTRING([Ops/SLA Month],1,CHARINDEX(' ',[Ops/SLA Month])-1)
else [Ops/SLA Month] end Month,
CASE WHEN CHARINDEX(' ',[Ops/SLA Month])>0
THEN SUBSTRING([Ops/SLA Month],CHARINDEX(' ',[Ops/SLA Month])+1,len([Ops/SLA Month]))
ELSE NULL END as OPS/SLA
from <table_name2>;
将table_name1,table_name2替换为您的字段。
答案 2 :(得分:0)
假设第一个单词(直到第一个空格)始终是月份,则后续应该起作用:
SELECT
CASE
WHEN CHARINDEX(' ', [OPS/SLA Month]) = 0 THEN NULL
ELSE SUBSTRING([OPS/SLA Month], 1, CHARINDEX(' ', [OPS/SLA Month]) - 1)
END AS [Months],
CASE
WHEN CHARINDEX(' ', [OPS/SLA Month]) = 0 THEN [OPS/SLA Month]
ELSE SUBSTRING([OPS/SLA Month], CHARINDEX(' ', [OPS/SLA Month]) + 1, 8000)
END AS [OPS/SLA]
FROM myTable