Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Заменить последовательности цифр в числе на их кол-во t-sql  [new]
alexvrm
Member

Откуда:
Сообщений: 1
Добрый вечер. Задача такая: все последовательности одинаковых цифр в числе заменить на их количество. Выполнить с помощью t-sql

Например, дано число 336704445, на выходе должно получиться 267035. желательно в виде цикла и как нибудь по простому. максимум что получилось, это удалить такие последовательности. буду благодарен за помощь
14 ноя 21, 17:44    [22395917]     Ответить | Цитировать Сообщить модератору
 Re: Заменить последовательности цифр в числе на их кол-во t-sql  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4705
alexvrm,

+ На коленке писал этот говнокод...
declare @sExpression varchar(200) = '336704445'
declare @sResult varchar(200) = ''

declare @i smallint  = 1
declare @j smallint = 0

declare @CharPrevios char(1)
declare @CharNow char(1)


while @i < = Len(@sExpression)
 begin
   set @CharNow = SUBSTRING(@sExpression, @i, 1)
   set @CharPrevios = SUBSTRING(@sExpression, @i-1, 1)
   if @i>1 and @CharNow <> @CharPrevios
    begin
      if @j>1 set @sResult = @sResult + CAST(@j as varchar(3))
	   else set @sResult = @sResult + @CharPrevios
	  set @j = 0 
    end
   set @j = @j + 1
   set @i = @i + 1
end
if Len(@sExpression)>1 and @CharNow <> @CharPrevios
 set @sResult = @sResult + @CharNow

select @sResult
15 ноя 21, 12:13    [22396119]     Ответить | Цитировать Сообщить модератору
 Re: Заменить последовательности цифр в числе на их кол-во t-sql  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4705
там в конце забыл добавить
 else if Len(@sExpression)>1 set @sResult = @sResult + CAST(@j as varchar(3))
15 ноя 21, 12:35    [22396135]     Ответить | Цитировать Сообщить модератору
 Re: Заменить последовательности цифр в числе на их кол-во t-sql  [new]
spenov
Member

Откуда: Москва
Сообщений: 211
alexvrm,

declare @s varchar(max)='336704445';

with 
  d as (--таблица с строкой под каждый символ
    select 
         chpos=row_number() over (order by 1/0)
      from string_split(replicate(' ,', datalength(@s)-1), ',')
  )
 ,c as (--разделение строки на символы и порядковый номер в строке
    select
         ch=substring(@s, chpos, 1)
        ,chpos
      from d
  )
 ,q as (--определение последовательностей в строке
    select 
         c.ch
        ,firstch=min(c.chpos)
        ,lastch=max(n.chpos)
      from c
	  join c n on n.ch=c.ch and n.chpos>c.chpos
	  where not exists(select *
	                     from c m
	                     where ch<>c.ch
	                       and chpos between c.chpos and n.chpos)
      group by c.ch
  )
  --получение итоговой строки
  select STRING_AGG(iif(q.ch is null, c.ch, cast(q.lastch-q.firstch+1 as varchar)),'') 
    from c
	left join q on q.firstch=c.chpos
	where not exists(select * --исключить символы, входящие в последовательность
	                   from q m
	                   where firstch<c.chpos
	                     and lastch>=c.chpos)
15 ноя 21, 13:56    [22396198]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить