Как получить все после и до строки в SQL Server - PullRequest
1 голос
/ 14 мая 2019

У меня есть похожие записи в моей базе данных:

Col1
---------
test\abcd\123\
test\abc\
test\abc\12\
test\abcdefg\1234\

Я хочу обрезать строку, чтобы получить: abcd или abc (средняя часть между двумя обратными слешами)

Я пробовал этот код, но он не работает (слишком много режет)

SELECT SUBSTRING(col1, CHARINDEX('\',col1) + 1, CHARINDEX('\',col1,CHARINDEX('\',col1)) + 1)

Мне просто нужна средняя часть между двумя обратными слешами.

1 Ответ

2 голосов
/ 15 мая 2019

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

with t(col1) as
(
 select 'test\abc\123\'      union all
 select 'test\abc\'          union all
 select 'test\abc\12\'       union all    
 select 'test\abcdefg\1234\'     
) 
select SUBSTRING(
         col1,
         CHARINDEX('\',col1)+1,
         CHARINDEX('\',col1,CHARINDEX('\',col1)+1)-
         CHARINDEX('\',col1)-1
         )
  from t;

Result String
-------------
abc
abc
abc
abcdefg

Демо

Редактировать (против вероятности использования значений col1 с менее чем двумя обратными слешами) :

select SUBSTRING(
         col1,
         CHARINDEX('\',col1)+1,
         CHARINDEX('\',col1,CHARINDEX('\',col1)+1)-
         CHARINDEX('\',col1)-1
         )
  from t
 where len(col1) - len(replace(col1,'\','')) >= 2   

, чтобы полностью отфильтровать их.

или

select case when len(col1) - len(replace(col1,'\','')) >= 2 then
       SUBSTRING(
         col1,
         CHARINDEX('\',col1)+1,
         CHARINDEX('\',col1,CHARINDEX('\',col1)+1)-
         CHARINDEX('\',col1)-1
         )
       else
         col1
       end
         as "Result String"           
  from t

отобразить все строки, оставить те же, что испортило правило.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...