sql Возвращает строку между двумя символами - PullRequest
0 голосов
/ 04 марта 2020

Я хочу знать гибкий способ извлечения строки между двумя '-'. Проблема в том, что «-» может существовать или не существовать в исходной строке. У меня есть следующий код, который отлично работает, когда '-' существует дважды в исходной строке, отмечая начало и конец извлеченной строки. Но он выдает ошибку «Недопустимый параметр длины, переданный в функцию LEFT или SUBSTRING», когда существует только один «-» или его нет вообще, или если строка пуста. Может кто-нибудь, пожалуйста, помогите? Спасибо

  declare @string varchar(100) = 'BLAH90-ExtractThis-WOW'
  SELECT SUBSTRING(@string,CHARINDEX('-',@string)+1, CHARINDEX('-',@string,CHARINDEX('-',@string)+1) -CHARINDEX('-',@string)-1) as My_String

Требуемый вывод: ExtractThis

Если есть только один da sh, например, 'BLAH90-ExtractThisWOW', то выход должен быть всем после первого da sh, т. Е. ExtractThisWOW. Если тире нет, вместо строки будет пробел, например, 'BLAH90 ExtractThisWOW', и он должен возвращать все после пробела, т.е. ExtractThisWOW.

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Вы можете попробовать что-то вроде этого.

Когда нет da sh, он начинается с пробела, если он есть, или принимает всю строку, если нет. Тогда я смотрю, если есть только один да sh или 2

declare @string varchar(100) = 'BLAH90-ExtractThis-WOW'
declare @dash_pos integer = CHARINDEX('-',@string)

SELECT CASE 
WHEN @dash_pos = 0 THEN 
       RIGHT(@string,LEN(@string)-CHARINDEX(' ',@string))
ELSE (
    CASE 
        WHEN @dash_pos = LEN(@string)-CHARINDEX('-',REVERSE(@string))+1 
        THEN RIGHT(@string,LEN(@string)-@dash_pos)
    ELSE SUBSTRING(@string,@dash_pos+1, CHARINDEX('-',@string,@dash_pos+1) - 
                                                     @dash_pos -1) 
    END
) 
END as My_String  
1 голос
/ 04 марта 2020

Возьмите существующий код:

declare @string varchar(100) = 'BLAH90-ExtractThis-WOW'
SELECT SUBSTRING(@string,CHARINDEX('-',@string)+1, CHARINDEX('-',@string,CHARINDEX('-',@string)+1) -CHARINDEX('-',@string)-1) as My_String

вставьте одну строку, например, так:

declare @string varchar(100) = 'BLAH90-ExtractThis-WOW'
SET @string = @string + '--'
SELECT SUBSTRING(@string,CHARINDEX('-',@string)+1, CHARINDEX('-',@string,CHARINDEX('-',@string)+1) -CHARINDEX('-',@string)-1) as My_String

и все готово. (Если NULL, вы получите NULL. Также будут возвращены все данные на основе ПЕРВОГО da sh, найденного в строке, независимо от того, сколько в строке есть тире.)

1 голос
/ 04 марта 2020

Попробуйте это. Если есть две черты, это займет то, что внутри. Если есть только один или нет, он сохранит исходную строку.

  declare @string varchar(100) = 'BLAH-90ExtractThisWOW'
  declare @dash_index1 int = case when @string like '%-%' then CHARINDEX('-', @string) else -1 end
  declare @dash_index2 int = case when @string like '%-%'then len(@string) - CHARINDEX('-', reverse(@string)) + 1 else -1 end

  SELECT case 
         when @dash_index1 <> @dash_index2 then SUBSTRING(@string,CHARINDEX('-',@string)+1, CHARINDEX('-',@string,CHARINDEX('-',@string)+1) -CHARINDEX('-',@string)-1) 
         else @string end
         as My_String
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...