Сервер SQL: замените значение, используя оператор like - PullRequest
1 голос
/ 20 сентября 2019

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

create table #t1
(
 a varchar(100)
)

create table #t2
(
 b varchar(100),
 c varchar(100)
)
insert into #t1 values('she is a girl teacher and he is  a boy doctor')
insert into #t2 values('girl','G')
insert into #t2 values('boy','B')

select *from #t1
select *from #t2

select a=replace (t1.a,t2.b,t2.c)  
from #t1 t1 inner join #t2 t2 on t1.a like '%'+t2.b+'%' 

, пока я выбираю запрос, результат отображается как

 she is a G teacher and he is  a boy doctor
 she is a girl teacher and he is  a B doctor

но мне нужен вывод типа

she is a G teacher and he is  a B doctor 

Как нужно изменить мой запрос для вышеприведенного вывода.

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Единственное решение, которое я могу придумать, используя рекурсивные запросы.

create table #t1
(
 a varchar(100)
)

create table #t2
(
 b varchar(100),
 c varchar(100)
)
insert into #t1 values('she is a girl teacher and he is  a boy doctor')
, ('she is a girl soldier and he is  a boy doctor')
, ('she is a girl dentist and he is  a boy farmer')
insert into #t2 values('girl','G')
insert into #t2 values('boy','B')

select *from #t1
select *from #t2

select a=replace(t1.a,t2.b,t2.c), *
from #t1 t1 
inner join #t2 t2 on t1.a like '%'+t2.b+'%';

with cte as (
    select a, 1 as ct from #t1
    union all
    select cast(replace(a,t2.b,t2.c) as varchar(100)) as a, ct+1 from cte
    cross apply #t2 t2 where  a like '%'+t2.b+'%'

)select distinct a from (select a, ct as ct from cte) as t1 where t1.ct = (select max(ct) from cte);

drop table #t1
drop table #t2
-- she is a G teacher and he is  a B doctor 
0 голосов
/ 20 сентября 2019

Самый простой способ - просто использовать курсор, чтобы перебрать все замены, применяя их.

create table #t1
(
 a varchar(100)
)

create table #t2
(
 b varchar(100),
 c varchar(100)
)
insert into #t1 values('she is a girl teacher and he is  a boy doctor')
insert into #t2 values('girl','G')
insert into #t2 values('boy','B')

-- We create a couple of variables and a temporal table to hold the incremental replacements
declare @Pattern varchar(64)
declare @Value varchar(64)
select * into #TempReplacements from #1

-- Apply the replacements 
declare Replacements cursor for select b, c from #t2
open Replacements
fetch next from Replacements into @Pattern, @Value
while @@fetch_status = 0
  update #TempReplacements set a = replace(a, @Pattern, @Value)
  fetch next from Replacements into @Pattern, @Value
end
close Replacements
deallocate Replacements

-- We return the results
select * from #TempRelacements

-- Drop temporary Table
drop table #TempReplacements

drop table #t1
drop table #t2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...