как разделить строчку в разные столбцы

у меня есть таблица с адресами email. Мне надо поделить каждый на логисческие части (текст, знак, число) и записать каждую часть в отдельный столбец.

Например: [email protected] = email(текст), .(знак), example(текст), 123(число)

Пример как это должно выглядеть

Может кто-то знает, как это можно сделать? На данном этапе мне удалось сделать только вот это:

if OBJECT_ID('tempdb..#t0') is not null drop table #t0

select convert(varchar(max), 'email.example123' )as email
into #t0

insert into #t0 values( 'anna12kot' )
insert into #t0 values( 'ania.kot21' )
insert into #t0 values( '31kot_ania' )
insert into #t0 values( 'example123' )
insert into #t0 values( 'email123' )
insert into #t0 values( 'example-ania' )
insert into #t0 values( 'example.12' )
insert into #t0 values( 'kot12example' )
insert into #t0 values( 'aniaania' )
insert into #t0 values( 'ak123456789' )
insert into #t0 values( 'anna.ania.example' )
insert into #t0 values( 'example' )
insert into #t0 values( 'kot12example' )
insert into #t0 values( 'kot_ania' )
insert into #t0 values( 'aniakot' )
insert into #t0 values( 'example.example' )


if OBJECT_ID('tempdb..#t1') is not null drop table #t1
select email,  len(email) as lengt, 
convert(nvarchar(max), '') as kod
,convert(nvarchar(max), '') as p1
,convert(nvarchar(max), '') as p2
,convert(nvarchar(max), '') as p3
,convert(nvarchar(max), '') as p4
,convert(nvarchar(max), '') as p5
,convert(nvarchar(max), '') as p6
,convert(nvarchar(max), '') as p7
into #t1
from #t0


declare @i as int = 1
while @i <= (SELECT TOP 1 LENGT FROM #T1 ORDER BY LENGT DESC)
begin
update #t1
set kod = kod +
 case when substring(email, @i, 1) like '[a-z]' then 's'
      when substring(email, @i, 1) like '[0-9]' then 'n'
      when substring(email, @i, 1) like '[!#$%&*()_-+=<,>.?/\|]' then 'c'
      else ''
 end
 set @i = @i+1
end


select * from #t1

А в результате вышло (s=string, c=char, n=number) :

Результат

Я пробовала сделать это при помощи if , но у меня не получилось, так как мы сравниваем не единичное значение, а много значений

declare @a as int = 1;
while @a <= (SELECT TOP 1 LENGT FROM #T1 ORDER BY LENGT DESC)
begin

update #t1 set p1 = p1 + substring(kod, @a, 1) 
set @a = @a+1

if (select substring(kod, @a, 1) from #t1) != (select substring(kod, @a+1, 1) from #t1) break 

Помогите мне придумать, как это сделать

P.S. функции string_split у меня не работают, так как версия скля старая


Ответы (1 шт):

Автор решения: Scrappy Coco

На мой взгляд под эту задачу хорошо подойдет регулярное выражение:

DECLARE @source TABLE (Email NVARCHAR(MAX))
INSERT INTO @source (Email) VALUES (N'kot12example'), ('kot_ania')

SELECT *
FROM @source AS Source
CROSS APPLY (
  SELECT
    Part1 = MAX(IIF(MatchNumber = 0, Value, NULL)),
    Part2 = MAX(IIF(MatchNumber = 1, Value, NULL)),
    Part3 = MAX(IIF(MatchNumber = 2, Value, NULL)),
    Part4 = MAX(IIF(MatchNumber = 3, Value, NULL)),
    Part5 = MAX(IIF(MatchNumber = 4, Value, NULL))
  FROM Utils.regex. Match(Source.Email, N'([a-zA-Z]+|[0-9]+|[^0-9a-zA-Z]+)', 1)
  GROUP BY Regex.GroupName
) AS Parts

Встроенной поддержки регулярок в MS SQL нет, но это легко можно сделать на C#. Реализацию можно взять тут.

→ Ссылка