powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / И опять вопрос про CTE
14 сообщений из 14, страница 1 из 1
И опять вопрос про CTE
    #39658169
swd1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! )

Вопрос по задачке:
Имеется таблица:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with tmp as (
	select 1 as col, '111' as val
	UNION
	select 2 as col, '1111' as val
	UNION
	select 3 as col, '11111' as val
)
select * from tmp



1 111
2 1111
3 11111



Нужно в ней каждый второй символ заменить на ноль (111) ->(101)

Я написал запрос (спасибо IAP) на одну строку (111)



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with T(str_in, i, s_str) AS
(
		
 SELECT '111' str_in, 0 i, '' s_out
 UNION ALL
 SELECT '111', i + 1, case 
		when (i+1)%2=0 and SUBSTRING(str_in, i+1,1) = '1' then '0'
		else SUBSTRING(str_in, i+1,1)
		end 
		FROM T 
	WHERE i<LEN('111')
	
)

SELECT s_str FROM T
WHERE i > 0
ORDER BY i



1
0
1



Но это в столбец, но как сделать это встроку (STUFF и XML ?)
И как этот CTE подружить с первой таблицей?

Спасибо!
...
Рейтинг: 0 / 0
И опять вопрос про CTE
    #39658177
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swd1986Нужно в ней каждый второй символ заменить на ноль (111) ->(101)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with tmp as (
	select 1 as col, '111' as val
	UNION
	select 2 as col, '1111' as val
	UNION
	select 3 as col, '11111' as val
)
select col, replace(val, '11', '10') as val from tmp
...
Рейтинг: 0 / 0
И опять вопрос про CTE
    #39658184
swd1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
шК0ДЕРswd1986Нужно в ней каждый второй символ заменить на ноль (111) ->(101)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with tmp as (
	select 1 as col, '111' as val
	UNION
	select 2 as col, '1111' as val
	UNION
	select 3 as col, '11111' as val
)
select col, replace(val, '11', '10') as val from tmp



Спасибо! Прошу прощения, уточнить хотел - данные произвольные,
select 1 as col, '1234' as val
UNION
select 2 as col, '12345' as val
UNION
select 3 as col, '123456' as val

С меня спрашивают именно умению работать с индексом строк
...
Рейтинг: 0 / 0
И опять вопрос про CTE
    #39658206
swd1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
swd1986Всем привет! )

Вопрос по задачке:
Имеется таблица:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with tmp as (
	select 1 as col, '111' as val
	UNION
	select 2 as col, '1111' as val
	UNION
	select 3 as col, '11111' as val
)
select * from tmp



1 111
2 1111
3 11111



Нужно в ней каждый второй символ заменить на ноль (111) ->(101)

Я написал запрос (спасибо IAP) на одну строку (111)



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with T(str_in, i, s_str) AS
(
		
 SELECT '111' str_in, 0 i, '' s_out
 UNION ALL
 SELECT '111', i + 1, case 
		when (i+1)%2=0 and SUBSTRING(str_in, i+1,1) = '1' then '0'
		else SUBSTRING(str_in, i+1,1)
		end 
		FROM T 
	WHERE i<LEN('111')
	
)

SELECT s_str FROM T
WHERE i > 0
ORDER BY i



1
0
1



Но это в столбец, но как сделать это встроку (STUFF и XML ?)
И как этот CTE подружить с первой таблицей?

Спасибо!


Получилось сделать в строку...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with T(str_in, i, s_str) AS
(
		
 SELECT '111' str_in, 0 i, '' s_out
 UNION ALL
 SELECT '111', i + 1, case 
		when (i+1)%2=0 and SUBSTRING(str_in, i+1,1) = '1' then '0'
		else SUBSTRING(str_in, i+1,1)
		end 
		FROM T 
	WHERE i<LEN('111')
	
)

select top 1 stuff((select s_str 
            FROM T 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') ,1,0,'') str_out FROM t



101



Как теперь подружить с 1 ой таблицей))
...
Рейтинг: 0 / 0
И опять вопрос про CTE
    #39658266
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swd1986,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
with tmp as (
	select 1 as col, '111' as val
	UNION
	select 2 as col, '1111' as val
	UNION
	select 3 as col, '11111' as val
),
 T(col,str_in, i, s_str) AS
(
		
 SELECT col,val as str_in, 0 as i, '' as s_out	From tmp
 UNION ALL
 SELECT col,str_in, i + 1, case 
		when (i+1)%2=0 and SUBSTRING(str_in, i+1,1) = '1' then '0'
		else SUBSTRING(str_in, i+1,1)
		end 
		FROM T 
	WHERE i<LEN(str_in)
	
)

select stuff((select s_str 
            FROM T 
			Where tmp.col = t.col
			--если col не уникально использовать условие Where tmp.val = t.str_in
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') ,1,0,'') str_out FROM tmp
...
Рейтинг: 0 / 0
И опять вопрос про CTE
    #39658283
swd1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopellyswd1986,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
with tmp as (
	select 1 as col, '111' as val
	UNION
	select 2 as col, '1111' as val
	UNION
	select 3 as col, '11111' as val
),
 T(col,str_in, i, s_str) AS
(
		
 SELECT col,val as str_in, 0 as i, '' as s_out	From tmp
 UNION ALL
 SELECT col,str_in, i + 1, case 
		when (i+1)%2=0 and SUBSTRING(str_in, i+1,1) = '1' then '0'
		else SUBSTRING(str_in, i+1,1)
		end 
		FROM T 
	WHERE i<LEN(str_in)
	
)

select stuff((select s_str 
            FROM T 
			Where tmp.col = t.col
			--если col не уникально использовать условие Where tmp.val = t.str_in
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') ,1,0,'') str_out FROM tmp



Обалдеть! А я уже отчаялся, такого понаписал)) Kopelly - спасибо!!!))
...
Рейтинг: 0 / 0
И опять вопрос про CTE
    #39658288
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swd1986Спасибо! Прошу прощения, уточнить хотел - данные произвольные
Ваш пример реализации этому противоречит...
Не проще ли для универсальности написать функцию?
Первое, что пришло в голову...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create function [dbo].[Replacer] (@Str    varchar(max),
                                  @Symbol varchar(1))  
returns varchar(max)  
with execute as caller  
as  
begin  
  declare @Result varchar(max) = ''
  while ceiling((len(@Str) / 2.0)) <> 0
  begin
	select @Result = @Result + left(@str, 1) + case when len(@str) > 1 then @Symbol else '' end, 
	       @Str = substring(@Str, 2 + 1, len(@Str))
  end
  return @Result
end


А потом просто подставить
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with tmp (col, val) as (
	select 1, '1234'   union all
        select 2, '12345'  union all
        select 3, '123456' union all
	select 4, '111'    union all
	select 5, '1111'   union all
	select 6, '11111'  union all
	select 7, '0'      union all
	select 8, '')
select col, 
       dbo.Replacer(val, '0') as val 
  from tmp



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
1	1030
2	10305
3	103050
4	101
5	1010
6	10101
7	0
8	
...
Рейтинг: 0 / 0
И опять вопрос про CTE
    #39658317
swd1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
шК0ДЕР,

Я извиняюсь перед Вами) это просто я не донес подробности задачи

Ну и я был бы очень рад использовать процедуры/функции, но мне не разрешают этого делать )))

Такие вот задачки...
...
Рейтинг: 0 / 0
И опять вопрос про CTE
    #39658323
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swd1986я был бы очень рад использовать процедуры/функции, но мне не разрешают этого делатьА зря...
...
Рейтинг: 0 / 0
И опять вопрос про CTE
    #39658369
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swd1986,

А что разрешают?
...
Рейтинг: 0 / 0
И опять вопрос про CTE
    #39658381
swd1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invmswd1986,

А что разрешают?

Только CTE )
...
Рейтинг: 0 / 0
И опять вопрос про CTE
    #39658392
лолл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕР, вашу функцию можно легко переписать через рекурсивное CTE
...
Рейтинг: 0 / 0
И опять вопрос про CTE
    #39658402
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swd1986Только CTE )
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
with d as
(
 select
  col, val
 from
  (values (1, '1234'), (2, '12345'), (3, '123456')) t(col, val)
),
n as
(
 select 1 as n, max(len(val)) as ml from d

 union all

 select
  n + 1, ml
 from
  n
 where
  n <= n.ml
)
select
 d.col, d.val, a.x.value('.', 'varchar(max)')
from
 d cross apply
 (
  select
   case (n - 1) % 2 when 1 then '0' else substring(d.val, n.n, 1) end
  from
   n
  where
   n.n <= len(d.val)
  for xml path(''), type
 ) a(x);
...
Рейтинг: 0 / 0
И опять вопрос про CTE
    #39658414
swd1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

invmswd1986Только CTE )
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
with d as
(
 select
  col, val
 from
  (values (1, '1234'), (2, '12345'), (3, '123456')) t(col, val)
),
n as
(
 select 1 as n, max(len(val)) as ml from d

 union all

 select
  n + 1, ml
 from
  n
 where
  n <= n.ml
)
select
 d.col, d.val, a.x.value('.', 'varchar(max)')
from
 d cross apply
 (
  select
   case (n - 1) % 2 when 1 then '0' else substring(d.val, n.n, 1) end
  from
   n
  where
   n.n <= len(d.val)
  for xml path(''), type
 ) a(x);



Спасибо тебе большущее! Оооофигеть запрос) И кстати, кое что узнал из этого запроса!

Спасибо!!!!!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / И опять вопрос про CTE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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