it-swarm.com.ru

Как извлечь эту конкретную подстроку в SQL Server?

У меня есть строка с определенным рисунком:

23;chair,red [$3]

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

Предполагая, что точка с запятой ; всегда существует, а левая квадратная скобка [ всегда присутствует в строке, как извлечь текст между (и не включая) ; и [ в запросе SQL Server? Благодарю.

11
RJIGO

Объедините функции SUBSTRING(), LEFT() и CHARINDEX().

SELECT LEFT(SUBSTRING(YOUR_FIELD,
                      CHARINDEX(';', YOUR_FIELD) + 1, 100),
                      CHARINDEX('[', YOUR_FIELD) - 1)
FROM YOUR_TABLE;

Это предполагает, что длина вашего поля никогда не будет превышать 100, но вы можете сделать это умнее, чтобы учитывать это при необходимости, используя функцию LEN(). Я не стал беспокоиться, потому что там уже достаточно событий, и у меня нет экземпляра для проверки, поэтому я просто смотрю в скобки и т.д.

20
Marc

Предполагая, что они всегда существуют и не являются частью ваших данных, это будет работать:

declare @string varchar(8000) = '23;chair,red [$3]'
select substring(@string, charindex(';', @string) + 1, charindex(' [', @string) - charindex(';', @string) - 1)
5
Michael Dean

Альтернатива ответу предоставленному @Marc

SELECT SUBSTRING(LEFT(YOUR_FIELD, CHARINDEX('[', YOUR_FIELD) - 1), CHARINDEX(';', YOUR_FIELD) + 1, 100)
FROM YOUR_TABLE
WHERE CHARINDEX('[', YOUR_FIELD) > 0 AND
    CHARINDEX(';', YOUR_FIELD) > 0;

Это гарантирует, что разделители существуют, и решает проблему с принятым в настоящее время ответом, когда выполнение LEFT last работает с положением последнего разделителя в исходной строке, а не с измененной подстрокой.

1
Reuben

Если вам нужно разделить что-то на 3 части, например, адрес электронной почты, и вы не знаете длину средней части, попробуйте это (я только что запустил это на sqlserver 2012, так что я знаю, что это работает):

SELECT top 2000 
    emailaddr_ as email,
    SUBSTRING(emailaddr_, 1,CHARINDEX('@',emailaddr_) -1) as username,
    SUBSTRING(emailaddr_, CHARINDEX('@',emailaddr_)+1, (LEN(emailaddr_) - charindex('@',emailaddr_) - charindex('.',reverse(emailaddr_)) ))  domain 
FROM 
    emailTable
WHERE 
    charindex('@',emailaddr_)>0 
    AND 
    charindex('.',emailaddr_)>0;
GO

Надеюсь это поможет.

0
TekOps

выберите подстроку (your_field, CHARINDEX (';', your_field) +1 , CHARINDEX ('[', your_field) -CHARINDEX (';', your_field) -1) из your_table

Не могу заставить других работать. Я верю, что вы просто хотите что-то промежуточное ';' и '[' во всех случаях независимо от длины строки между ними. После указания поля в функции подстроки вторым аргументом является начальная позиция того, что вы будете извлекать. То есть где ';' + 1 (четвертая позиция - с), потому что вы не хотите включать ';'. Следующий аргумент берет местоположение '[' (позиция 14) и вычитает местоположение пятна после ';' (четвертая позиция - вот почему я теперь вычитаю 1 в запросе). В основном это говорит о подстроке (поле, место, где я хочу, чтобы подстрока начиналась, как долго я хочу, чтобы подстрока была). Я использовал эту же функцию в других случаях. Если в некоторых полях нет ';' и '[', вы захотите отфильтровать их в предложении "где", но это немного отличается от вопроса. Если твой ';' было сказано ... ';;;', вы бы использовали 3 вместо 1 в примере. Надеюсь это поможет! 

0
Nate Lincoln