Я действительно получил удовольствие от этого
Что делает код:
- Используйте CTE1 для преобразования значения столбца в узлы xml на основе разделителя '-'
- Используйте CTE2 для разбора узлов на отдельные строки
- Поместите значения строк с помощью ROW_NUMBER (), чтобы я мог выбрать rowid = 2 и charindex> 0 (ища a / b)
Код:
create table #temp (uniqID int , refidfield varchar(30));
insert into #temp
values
(1, 'CLC-04a-CCC-ILS')
, (2, 'CLC-04b-CCC-ILS')
, (3, 'RX-101a-ICP')
, (4, 'RX-101b-ICP');
;with CTE1 as
(
select
uniqID
, refidfield
, cast('<A>'+ replace(refidfield,'-','</A><A>')+ '</A>' as xml) as Data
from #temp as t
)
, CTE2 as
(
select
uniqID,
refidfield,
F.x.value('.', 'nvarchar(max)') as Data,
CASE
WHEN CHARindex('a', F.x.value('.', 'nvarchar(max)'),1)>0 then 'A GROUP'
WHEN CHARindex('b', F.x.value('.', 'nvarchar(max)'),1)>0 then 'B GROUP'
END as GRP
, Row_NUmber() OVER (Partition BY uniqID ORDER BY (SELECT NULL)) AS ID
from
CTE1 as c
outer apply c.Data.nodes('/A') as F(x)
)
SELECT
refidfield
, GRP
, LEFT(NewDisplay,LEN(NewDisplay)-1) AS NewReferenceIDField
FROM
(
SELECT
*
, (SELECT Data FROM cte2 y WHERE ID=1 AND y.refidfield=x.refidfield)+'-'
+(SELECT Data FROM cte2 y WHERE ID=2 AND y.refidfield=x.refidfield) NewDisplay
FROM cte2 x
) z
WHERE ID=2 and (CHARINDEX('b', Data,1)>0 OR CHARINDEX('a', Data,1)>0)