Расщепление строки на основе разделителя - PullRequest
0 голосов
/ 23 апреля 2019

Я хочу извлечь строку после второго символа _, а также удалить (C) в запросе Microsoft SQL Server.

Имя поля: Код актива

Имя таблицыis dbo.DynamicsMOJ Data

Примеры данных:

Значения для кода актива

CP04K_54560_633331 (C)
CP04K_54560_641121 (C)
ME030_72159_690940 (C)
HB21M_60966_1181492 (C)
AW000_1144713 (C)

И т. д., все значения в этом поле имеют одинаковый формат, но только некоторыеесть один "_"

Мне нужно получить

'633331'
'641121'
'690940'
'1181492'
'1144713'

1 Ответ

1 голос
/ 23 апреля 2019

Мои варианты:

SELECT
  txt,
  CHARINDEX('_',REVERSE(txt)), -- there is 0 for four last examples
  --REPLACE(RIGHT(txt,ISNULL(NULLIF(CHARINDEX('_',REVERSE(txt))-1,-1),LEN(txt))),' (C)','')
  -- the next variants is better if we have different count of spaces before '(C)'
  RTRIM(REPLACE(RIGHT(txt,ISNULL(NULLIF(CHARINDEX('_',REVERSE(txt))-1,-1),LEN(txt))),'(C)','')),
  RTRIM(REPLACE(IIF(CHARINDEX('_',txt)=0,txt,RIGHT(txt,CHARINDEX('_',REVERSE(txt))-1)),'(C)',''))
FROM
  (VALUES
    ('CP04K_54560_633331 (C)'),
    ('CP04K_54560_641121 (C)'),
    ('ME030_72159_690940 (C)'),
    ('HB21M_60966_1181492 (C)'),
    ('AW000_1144713 (C)'),
    (NULL),
    (''),
    ('1234567(C)'),
    ('1234567       (C)'),
    ('1234567')
  ) v(txt)

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

SELECT *
FROM
  (VALUES
    ('CP04K_54560_633331 (C)'),
    ('CP04K_54560_641121 (C)'),
    ('ME030_72159_690940 (C)'),
    ('HB21M_60966_1181492 (C)'),
    ('AW000_1144713 (C)'),
    (NULL),
    (''),
    ('1234567(C)'),
    ('1234567       (C)'),
    ('1234567')
  ) v(txt)
WHERE CHARINDEX('_',txt)=0

Я думаю, что вы получите все значения без '_'.

...