powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выделение подстроки с e-mail c помощью patindex и тп
9 сообщений из 9, страница 1 из 1
Выделение подстроки с e-mail c помощью patindex и тп
    #39637731
Фотография DimaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, есть у кого под рукой для MS SQL кусок кода (функция), чтобы сделать выделение подстроки с e-mail c помощью patindex (и тп) из большой строки. Е-mail (в строке один) может быть ограничен пробелами или точкой, запятой. Например:
Из строк:
1) jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s Mail1@privet.ru SFFSFSS SFS
2) jgjjgj gdldg;dg; dg''dg'g'd'g' Mail2777@privet.com, tel 12234

надо получить Mail1@privet.ru Mail2777@privet.com
...
Рейтинг: 0 / 0
Выделение подстроки с e-mail c помощью patindex и тп
    #39637955
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DECLARE @t TABLE ( [text] VARCHAR(500) )
INSERT INTO @t
VALUES
  ( 'jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s Mail1@privet.ru SFFSFSS SFS' ),
  ( 'jgjjgj gdldg;dg; dg''''dg''g''d''g'' Mail2777@privet.com, tel 12234' )
;
SELECT
  [text],
  [email] = SUBSTRING( [text], [i] - [ib] + 1, [ib] + [ie] - 1 )
FROM
  @t t
  CROSS APPLY (
    SELECT
      [len] = LEN( [text] ),
      [i] = PATINDEX( '%@%', [text] )
  ) ss1
  CROSS APPLY (
    SELECT
      [ib] = PATINDEX( '%[ ,;]%', REVERSE( SUBSTRING( [text], 1, [i] - 1 ) ) ),
      [ie] = PATINDEX( '%[ ,;]%', SUBSTRING( [text], [i] + 1, [len] - [i] ) )
  ) ss2


А вообще, смотри в строну REGEX, которые в T-SQL можно заполучить с помощью .NET CLR
...
Рейтинг: 0 / 0
Выделение подстроки с e-mail c помощью patindex и тп
    #39638087
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан Дамирович
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DECLARE @t TABLE ( [text] VARCHAR(500) )
INSERT INTO @t
VALUES
  ( 'jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s Mail1@privet.ru SFFSFSS SFS' ),
  ( 'jgjjgj gdldg;dg; dg''''dg''g''d''g'' Mail2777@privet.com, tel 12234' )
;
SELECT
  [text],
  [email] = SUBSTRING( [text], [i] - [ib] + 1, [ib] + [ie] - 1 )
FROM
  @t t
  CROSS APPLY (
    SELECT
      [len] = LEN( [text] ),
      [i] = PATINDEX( '%@%', [text] )
  ) ss1
  CROSS APPLY (
    SELECT
      [ib] = PATINDEX( '%[ ,;]%', REVERSE( SUBSTRING( [text], 1, [i] - 1 ) ) ),
      [ie] = PATINDEX( '%[ ,;]%', SUBSTRING( [text], [i] + 1, [len] - [i] ) )
  ) ss2


А вообще, смотри в строну REGEX, которые в T-SQL можно заполучить с помощью .NET CLR

Не надо RegExp. Вы бредите.
RegExp - это ужос.
Причем вредный ужос.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE @t TABLE ( [text] VARCHAR(500) )
INSERT INTO @t
VALUES
  ( 'jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s Mail1@privet.ru SFFSFSS SFS' ),
  ( 'jgjjgj gdldg;dg; dg''''dg''g''d''g'' Mail2777@privet.com, tel 12234' )
;

with t as (SELECT [text], txt = replace([text], ';', ' ' from @t )
   , x as ( select t.[text],  x.s from t cross apply split(t.txt) as x(s) )
  select * from x where charindex(s, '@') > 0
...
Рейтинг: 0 / 0
Выделение подстроки с e-mail c помощью patindex и тп
    #39638091
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,
Код split(t.txt) опубликуйте, иначе ваше предположение "Не надо RegExp. Вы бредите." я буду считать переходом на личности.

Я очень хорошо разбираюсь в RegEx, и в том, что его не нужно применять повсеместно.
Но в целом, в контексте задачи извлечения данных из мусорного набора текста - лучше, чем "вредный ужос" придумать очень сложно.
...
Рейтинг: 0 / 0
Выделение подстроки с e-mail c помощью patindex и тп
    #39638241
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
STRING_SPLIT (Transact-SQL)
 ‎10‎.‎06‎.‎2016

Разделяет символьное выражение с использованием указанного разделителя.
...
Рейтинг: 0 / 0
Выделение подстроки с e-mail c помощью patindex и тп
    #39638741
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан Дамирович,

как здесь помогут регулярные выражения? Заменить на пустую строку все, что не выражение?
...
Рейтинг: 0 / 0
Выделение подстроки с e-mail c помощью patindex и тп
    #39638963
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовРуслан Дамирович,

как здесь помогут регулярные выражения? Заменить на пустую строку все, что не выражение?

Если регулярные выражения залиты на сервер то как то так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
declare @str1 varchar(max) = 'jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s Mail1@privet.ru SFFSFSS SFS'
declare @str2 varchar(max) = 'jgjjgj gdldg;dg; dg''''dg''g''d''g'' Mail2777@privet.com, tel 12234'
declare @mail varchar(100) = '([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)'

select Tools.dbo.fn_Replace(@str1,'^(.*)(?<M>'+@mail+')(.*)$','${M}') where Tools.dbo.fn_isMatch(@str1,@mail)=1 -->1@privet.ru
select Tools.dbo.fn_Replace(@str2,'^(.*)(?<M>'+@mail+')(.*)$','${M}') where Tools.dbo.fn_isMatch(@str2,@mail)=1 -->7@privet.com
...
Рейтинг: 0 / 0
Выделение подстроки с e-mail c помощью patindex и тп
    #39639013
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример Руслана Дамировича для случаев, когда Е-mail может быть в начале или в конце строки:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
insert @t
values
  ('jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s Mail1@privet.ru SFFSFSS SFS'),
  ('jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s Mail1@privet.ru; SFFSFSS SFS'),
  ('jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s ,Mail1@privet.ru; SFFSFSS SFS'),
  ('jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s ;Mail1@privet.ru; SFFSFSS SFS'),
  ('Mail1@privet.ru; SFFSFSS SFS'),
  ('jgjjgj gdldg;dg; dg''''dg''g''d''g'' Mail2777@privet.com');

select text,
       substring(text, i-ib, ib+ie) as email
  from @t t
  cross apply (select patindex('%@%', text) as i
              ) ss1
  cross apply (select patindex('%[ ,;]%', reverse(substring(' '+text, 1,   i-1)))  as ib,
                      patindex('%[ ,;]%',         substring(text+' ', i+1, 8000))  as ie
              ) ss2
...
Рейтинг: 0 / 0
Выделение подстроки с e-mail c помощью patindex и тп
    #39639275
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-lдля случаев, когда Е-mail может быть в начале или в конце строки
...нужно просто поставить в начале и в конце искомой строки символ разделителя, например
Код: sql
1.
';' + [text] + ';' )


и конечно, добавить условие, что знак @ вообще есть в тексте - иначе не взлетит.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выделение подстроки с e-mail c помощью patindex и тп
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]