RegEx в SQL Server - строка с разделителями-дефисами - PullRequest
0 голосов
/ 29 октября 2019

Мне нужно определить, когда поле имеет «a» или «b» во 2-м сегменте строки, разделенной дефисами.

Например:

ReferenceIDField:

CLC-04a-CCC-ILS

CLC-04b-CCC-ILS

RX-101a-ICP

RX-101b-ICP

Мне нужно пометить каждое значение с помощью «a» или «b» во втором сегменте отдельно как

ReferenceIDFlag:

группа

группа B

группа

группа B

ТО мне также нужно создать новый столбец для этих значенийпереименовывая их соответственно, как показано ниже.

NewReferenceIDField:

CLC-04

CLC-04

RX-101

RX-101

Я исследовал шаблоны регулярных выражений, но мне не повезло найти примеры, соответствующие моему сценарию. Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Вы можете использовать приведенный ниже запрос, чтобы получить два значения столбца:

create table #temp (ReferenceIDField varchar(30));
insert into #temp values ('CLC-04a-CCC-ILS')
                       , ('CLC-04b-CCC-ILS')
                       , ('RX-101a-ICP')
                       , ('RX-101b-ICP');

select ReferenceIDField
    , UPPER(right(left(secondpart, charindex('-', secondpart) - 1), 1)) + ' group' as ReferenceIDFlag
    , left(ReferenceIDField, CHARINDEX('-', ReferenceIDField, 0) + charindex('-', secondpart) - 2) as NewReferenceIDField
from (
select ReferenceIDField
    , RIGHT(ReferenceIDField, len(ReferenceIDField) - CHARINDEX('-', ReferenceIDField, 0)) secondpart
from #temp
) x

Выход:

enter image description here

I 'Я уверен, что вы можете найти решение, используя PATINDEX , но я предпочитаю использовать функции LEFT и RIGHT, пока производительность не станет проблемой.

0 голосов
/ 29 октября 2019

Я действительно получил удовольствие от этого

Что делает код:

  1. Используйте CTE1 для преобразования значения столбца в узлы xml на основе разделителя '-'
  2. Используйте CTE2 для разбора узлов на отдельные строки
  3. Поместите значения строк с помощью ROW_NUMBER (), чтобы я мог выбрать rowid = 2 и charindex> 0 (ища a / b)

enter image description here

Код:

    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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...