Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выделение подстроки с e-mail c помощью patindex и тп  [new]
DimaU
Member

Откуда: Москва
Сообщений: 548
Народ, есть у кого под рукой для 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
27 апр 18, 20:53    [21375350]     Ответить | Цитировать Сообщить модератору
 Re: Выделение подстроки с e-mail c помощью patindex и тп  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
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
28 апр 18, 11:56    [21376635]     Ответить | Цитировать Сообщить модератору
 Re: Выделение подстроки с e-mail c помощью patindex и тп  [new]
aleks222
Member

Откуда:
Сообщений: 855
Руслан Дамирович
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 - это ужос.
Причем вредный ужос.

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
28 апр 18, 15:38    [21377471]     Ответить | Цитировать Сообщить модератору
 Re: Выделение подстроки с e-mail c помощью patindex и тп  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
aleks222,
Код split(t.txt) опубликуйте, иначе ваше предположение "Не надо RegExp. Вы бредите." я буду считать переходом на личности.

Я очень хорошо разбираюсь в RegEx, и в том, что его не нужно применять повсеместно.
Но в целом, в контексте задачи извлечения данных из мусорного набора текста - лучше, чем "вредный ужос" придумать очень сложно.
28 апр 18, 15:46    [21377493]     Ответить | Цитировать Сообщить модератору
 Re: Выделение подстроки с e-mail c помощью patindex и тп  [new]
aleks222
Member

Откуда:
Сообщений: 855
STRING_SPLIT (Transact-SQL)
 ‎10‎.‎06‎.‎2016

Разделяет символьное выражение с использованием указанного разделителя.
29 апр 18, 03:14    [21378348]     Ответить | Цитировать Сообщить модератору
 Re: Выделение подстроки с e-mail c помощью patindex и тп  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7407
Руслан Дамирович,

как здесь помогут регулярные выражения? Заменить на пустую строку все, что не выражение?
1 май 18, 17:07    [21381583]     Ответить | Цитировать Сообщить модератору
 Re: Выделение подстроки с e-mail c помощью patindex и тп  [new]
Alexander Us
Member

Откуда:
Сообщений: 1095
Владислав Колосов
Руслан Дамирович,

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


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

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
2 май 18, 13:05    [21382566]     Ответить | Цитировать Сообщить модератору
 Re: Выделение подстроки с e-mail c помощью patindex и тп  [new]
Wlr-l
Member

Откуда:
Сообщений: 512
Пример Руслана Дамировича для случаев, когда Е-mail может быть в начале или в конце строки:
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
2 май 18, 15:53    [21382789]     Ответить | Цитировать Сообщить модератору
 Re: Выделение подстроки с e-mail c помощью patindex и тп  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Wlr-l
для случаев, когда Е-mail может быть в начале или в конце строки

...нужно просто поставить в начале и в конце искомой строки символ разделителя, например
';' + [text] + ';' )

и конечно, добавить условие, что знак @ вообще есть в тексте - иначе не взлетит.
3 май 18, 11:57    [21383930]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить