+6LC+YOP+Y3E 如何取加号之间的字符串单独成几列
有这样几十万个字符串,列举如下几个:
+6LC+YOP+Y3E
++6LC+TDF+Kaletra
+EFV+6LC+Y3E
6LC+BGH+Atripla
6LC+BGH+Y3E
+++6LC+BGH+Y3E+
+6LC+BGH+克芝
6LC+YOP++
DDI+克芝+6LC+BGH
EFV+6LC++双汰芝
EFV+Y3E+Eziom
EFV+Y3E+YOP+6LC+BGH
EFV++利韦+克芝
YOP
YOP+++
克芝
克芝+6LC+利韦
双汰芝+++
双汰芝+Kaletra++
想把加号(+)之间的字符串取出来,单独成为几列,比如++EFV+Y3E+Eziom 这个变成EFV Y3E Eziom 三列,其他类似
如果中间只有一个加号还好,但是加号多而且乱,所以不知道该怎么取了,有高手帮帮忙吗?谢啦!!
[最优解释]
我给你写个简单的。
你自己在控制列数把
--> 测试数据:#tb
IF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL DROP TABLE #tb
GO
CREATE TABLE #tb([name] VARCHAR(19))
INSERT #tb
SELECT '+6LC+YOP+Y3E' UNION ALL
SELECT '++6LC+TDF+Kaletra' UNION ALL
SELECT '+EFV+6LC+Y3E' UNION ALL
SELECT '6LC+BGH+Atripla' UNION ALL
SELECT '6LC+BGH+Y3E' UNION ALL
SELECT '+++6LC+BGH+Y3E+' UNION ALL
SELECT '+6LC+BGH+克芝' UNION ALL
SELECT '6LC+YOP++' UNION ALL
SELECT 'DDI+克芝+6LC+BGH' UNION ALL
SELECT 'EFV+6LC++双汰芝' UNION ALL
SELECT 'EFV+Y3E+Eziom' UNION ALL
SELECT 'EFV+Y3E+YOP+6LC+BGH' UNION ALL
SELECT 'EFV++利韦+克芝' UNION ALL
SELECT 'YOP' UNION ALL
SELECT 'YOP+++' UNION ALL
SELECT '克芝' UNION ALL
SELECT '克芝+6LC+利韦' UNION ALL
SELECT '双汰芝+++' UNION ALL
SELECT '双汰芝+Kaletra++'
--------------开始查询--------------------------
;WITH cte AS
(
SELECT name, [values] = C.v.value('.' , 'nvarchar(100)'),row_id=ROW_NUMBER()OVER(PARTITION BY [name] ORDER BY [name])
FROM (
SELECT [name],[values]= CONVERT( XML, '<root><v>'+ REPLACE ([name] , '+' , '</v><v>')+ '</v></root>').query('.') FROM #tb
) a
OUTER APPLY a.[values].nodes('/root/v') C (v)
WHERE C.v.value('.' , 'nvarchar(100)') <> ''
)
SELECT * FROM cte PIVOT(MAX([values]) FOR row_id IN([1],[2],[3],[4],[5],[6],[7])) pvt
----------------结果----------------------------
/*
name1234567
+++6LC+BGH+Y3E+6LCBGHY3ENULLNULLNULLNULL
++6LC+TDF+Kaletra6LCTDFKaletraNULLNULLNULLNULL
+6LC+BGH+克芝6LCBGH克芝NULLNULLNULLNULL
+6LC+YOP+Y3E6LCYOPY3ENULLNULLNULLNULL
+EFV+6LC+Y3EEFV6LCY3ENULLNULLNULLNULL
6LC+BGH+Atripla6LCBGHAtriplaNULLNULLNULLNULL
6LC+BGH+Y3E6LCBGHY3ENULLNULLNULLNULL
6LC+YOP++6LCYOPNULLNULLNULLNULLNULL
DDI+克芝+6LC+BGHDDI克芝6LCBGHNULLNULLNULL
EFV++利韦+克芝EFV利韦克芝NULLNULLNULLNULL
EFV+6LC++双汰芝EFV6LC双汰芝NULLNULLNULLNULL
EFV+Y3E+EziomEFVY3EEziomNULLNULLNULLNULL
EFV+Y3E+YOP+6LC+BGHEFVY3EYOP6LCBGHNULLNULL
YOPYOPNULLNULLNULLNULLNULLNULL
YOP+++YOPNULLNULLNULLNULLNULLNULL
克芝克芝NULLNULLNULLNULLNULLNULL
克芝+6LC+利韦克芝6LC利韦NULLNULLNULLNULL
双汰芝+++双汰芝NULLNULLNULLNULLNULLNULL
双汰芝+Kaletra++双汰芝KaletraNULLNULLNULLNULLNULL
*/
字段个数不一样,不一定能存成3列啊。
[其他解释]
你这个+++没有什么规律,看你是什么目的。你要是只是为了处理掉+,那么直接把replace(字符串,'+','')
[其他解释]
--> 测试数据:#tb
IF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL DROP TABLE #tb
GO
CREATE TABLE #tb([name] VARCHAR(19))
INSERT #tb
SELECT '+6LC+YOP+Y3E' UNION ALL
SELECT '++6LC+TDF+Kaletra' UNION ALL
SELECT '+EFV+6LC+Y3E' UNION ALL
SELECT '6LC+BGH+Atripla' UNION ALL
SELECT '6LC+BGH+Y3E' UNION ALL
SELECT '+++6LC+BGH+Y3E+' UNION ALL
SELECT '+6LC+BGH+克芝' UNION ALL
SELECT '6LC+YOP++' UNION ALL
SELECT 'DDI+克芝+6LC+BGH' UNION ALL
SELECT 'EFV+6LC++双汰芝' UNION ALL
SELECT 'EFV+Y3E+Eziom' UNION ALL
SELECT 'EFV+Y3E+YOP+6LC+BGH' UNION ALL
SELECT 'EFV++利韦+克芝' UNION ALL
SELECT 'YOP' UNION ALL
SELECT 'YOP+++' UNION ALL
SELECT '克芝' UNION ALL
SELECT '克芝+6LC+利韦' UNION ALL
SELECT '双汰芝+++' UNION ALL
SELECT '双汰芝+Kaletra++'
--------------开始查询--------------------------
SELECT [name] = C.v.value('.' , 'nvarchar(100)')
FROM (
SELECT [name]= CONVERT( XML, '<root><v>'+ REPLACE ([name] , '+' , '</v><v>')+ '</v></root>') FROM #tb
) a
OUTER APPLY a.[name].nodes('/root/v') C (v)
WHERE C.v.value('.' , 'nvarchar(100)') <> ''
----------------结果----------------------------
/*
name
6LC
YOP
Y3E
6LC
TDF
Kaletra
EFV
6LC
Y3E
6LC
BGH
Atripla
6LC
BGH
Y3E
6LC
BGH
Y3E
6LC
BGH
克芝
6LC
YOP
DDI
克芝
6LC
BGH
EFV
6LC
双汰芝
EFV
Y3E
Eziom
EFV
Y3E
YOP
6LC
BGH
EFV
利韦
克芝
YOP
YOP
克芝
克芝
6LC
利韦
双汰芝
双汰芝
Kaletra
*/