带有临时格式的sqlserver中的substring

时间:2016-09-07 11:57:39

标签: sql-server substring

我有这些行

14-L-100-10008-G03S-N
1-DR-100-20057-G48-N
2-CL-100-12133-B12-P
2-FG-100-12202-B01-N
2-G-100-15520-B48-N
2-GM-100-10024-B01-N
2-HC-100-10022-G03S-N
2-HC-100-10023-G03S-N
2-HC-100-20023-G03S-N
32-G-100-15518-F03P2-N
32-G-100-15518-F03P2-N

我只需要这些部分。如何使用sql server代码获取这些部分:

result:G03S,G48,B12,B01,B48,B12 and ...

2 个答案:

答案 0 :(得分:1)

您可以如下所示:

;WITH CTE
AS
(
select '14-L-100-10008-G03S-N' Val UNION ALL
select '1-DR-100-20057-G48-N' Val UNION ALL
select '2-CL-100-12133-B12-P' Val UNION ALL
select '2-FG-100-12202-B01-N' Val UNION ALL
select '2-G-100-15520-B48-N' Val UNION ALL
select '2-GM-100-10024-B01-N' Val UNION ALL
select '2-HC-100-10022-G03S-N' Val UNION ALL
select '2-HC-100-10023-G03S-N' Val UNION ALL
select '2-HC-100-20023-G03S-N' Val UNION ALL
select '32-G-100-15518-F03P2-N' Val UNION ALL
select '32-G-100-15518-F03P2-N'
)

SELECT REVERSE(SUBSTRING(REVERSE(Val), CHARINDEX('-', REVERSE(Val), 0) + 1, CHARINDEX('-', REVERSE(Val), CHARINDEX('-', REVERSE(Val), 0) + 1) - CHARINDEX('-', REVERSE(Val)) - 1)) 
FROM
    CTE

编辑:

SELECT
(
    SELECT REVERSE(SUBSTRING(REVERSE(Val), CHARINDEX('-', REVERSE(Val), 0) + 1, CHARINDEX('-', REVERSE(Val), CHARINDEX('-', REVERSE(Val), 0) + 1) - CHARINDEX('-', REVERSE(Val)) - 1))  + ' ,'
    FROM
        CTE
    FOR XML PATH ('')
) Result

结果:G03S ,G48 ,B12 ,B01 ,B48 ,B01 ,G03S ,G03S ,G03S ,F03P2 ,F03P2 ,

SELECT LEFT(A.Result, LEN(A.Result) -1) FROM 
(SELECT (SELECT REVERSE(SUBSTRING(REVERSE(Val), CHARINDEX('-', REVERSE(Val), 0) + 1, CHARINDEX('-', REVERSE(Val), CHARINDEX('-', REVERSE(Val), 0) + 1) - CHARINDEX('-', REVERSE(Val)) - 1))  + ' ,' FROM CTE FOR XML PATH ('') ) Result) A

结果:G03S ,G48 ,B12 ,B01 ,B48 ,B01 ,G03S ,G03S ,G03S ,F03P2 ,F03P2

答案 1 :(得分:0)

使用其中一个splitstring functions from here ..

create table #t
(
id varchar(max)
)

insert into #t
select '14-L-100-10008-G03S-N'
union all
select '1-DR-100-20057-G48-N'

select item
 from #t t1
cross apply
(select * ,row_number() over (partition by t1.id order by t1.id) as rn from [dbo].[SplitStrings_Numbers](t1.id,'-')
) b
where rn=5