从文本

时间:2017-10-03 07:05:24

标签: sql sql-server

我的列中包含月份名称以及特定月份名称后的其他文本。我想要做的是从该列中提取月份并创建一个名为Month的新列。

|Ops/SLA Month      |
|APRIL SLA Reporting|
|APRIL OPS Reporting|

这个专栏从4月到3月继续进行,这意味着我不能使用子字符串,因为月份有不同的字符长度。有没有办法可以编写一个case语句或一个将该列拆分为两列的查询?预期结果如下:

|Months |OPS/SLA      |
|April  |SLA Reporting|
|April  |OPS Reporting|

3 个答案:

答案 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