Изолирующая строка между 3 символами - PullRequest
1 голос
/ 24 апреля 2019

У меня есть представление, в котором я хотел бы создать столбец, который изолирует строку между 3 одинаковыми символами ("-"). Так, например, я хочу, чтобы AC-RBQ/4110-WS-L1 стал RBQ/4110.

Пока что я попробовал это, и это очень близко подходит ко мне.

SELECT SUBSTRING(locnum,CHARINDEX('-',locnum)+1,(((LEN(locnum))-CHARINDEX('-', REVERSE(locnum)))-CHARINDEX('-',locnum))) AS Result

Результат:

RBQ/4110-WS
RBQ/4110-CS

Мне просто нужно удалить этот последний "-WS" или "-CS"

Любые мысли или идеи будут с благодарностью!

Ответы [ 5 ]

4 голосов
/ 24 апреля 2019

Если шаблон непротиворечивый, возможно, parsename() будет хорошо здесь соответствовать

Пример

Declare @S varchar(100) = 'AC-RBQ/4110-WS-L1'

Select parsename(replace(@S,'-','.'),3)

Возвращает

RBQ/4110

РЕДАКТИРОВАТЬ -

На случай, если ваши данные более изменчивы, вы можете использовать XML для извлечения SECOND значение

Пример

Declare @YourTable table (locnum varchar(100))
Insert Into @YourTable values
('AC-RBQ/4110-WS-L1')

Select NewValue = convert(xml,'<x>'+replace(locnum,'-','</x><x>')+'</x>').value('/x[2]','varchar(100)')
 From  @YourTable

Возвращает

NewValue
RBQ/4110
1 голос
/ 24 апреля 2019

Казалось бы, проще разделить значение, а затем извлечь второй элемент из ваших данных. Если ваши данные всегда имеют 4 элемента (а вам всегда нужен второй), вы можете использовать PARSENAME:

SELECT PN.P
FROM (VALUES('AC-RBQ/4110-WS-L1'))V(S)
     CROSS APPLY (VALUES(PARSENAME(REPLACE(V.S,'-','.'),3)))PN(P); --Part 3 as PARSENAME works right to left

В противном случае вы можете использовать сплиттер, например delimitedsplit8k_lead:

SELECT DS.Item
FROM (VALUES('AC-RBQ/4110-WS-L1'))V(S)
     CROSS APPLY dbo.DelimitedSplit8K_lead(V.S,'-') DS
WHERE DS.ItemNumber = 2;
0 голосов
/ 24 апреля 2019
WITH TEMP AS
(
SELECT 'AC-RBQ/4110-WS-L1'  AS COL
)

SELECT * ,
CHARINDEX('-', [COL]) AS FR,
CHARINDEX('-', [COL],CHARINDEX('-', [COL])+1) AS FR2,
SUBSTRING([COL], CHARINDEX('-', [COL]) +1 ,CHARINDEX('-', [COL],CHARINDEX('- 
', [COL])+1) - (CHARINDEX('-', [COL]) +1) ) AS RESULT
FROM TEMP
0 голосов
/ 24 апреля 2019

Вы выполнили большую часть работы, и вам нужно получить левую часть результата до -:

SELECT 
  LEFT(SUBSTRING(locnum, CHARINDEX('-', locnum) + 1,
  (((LEN(locnum)) - CHARINDEX('-', REVERSE(locnum))) - CHARINDEX('-', locnum))),
  CHARINDEX('-', SUBSTRING(locnum, CHARINDEX('-', locnum) + 1,
  (((LEN(locnum)) - CHARINDEX('-', REVERSE(locnum))) - CHARINDEX('-', locnum)))) - 1) AS Result
0 голосов
/ 24 апреля 2019

Пожалуйста, попробуйте ниже Query. Если ваш шаблон совпадает с вашим вопросом, то сработает ниже.

select left(SUBSTRING('AC-RBQ/4110-WS-L1', charindex('-','AC-RBQ/4110-WS-L1') + 1, LEN('AC-RBQ/4110-WS-L1')),8)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...