2017-01-10 8 views
0

Wie aktualisiere/ersetze ich den Wert der ersten Tabelle aus der Liste meiner zweiten Tabelle in SQL. Tut mir leid, ich bin nicht so gut in der Verwendung von replace() von SQL vor allem von den Werten Basis aus verschiedenen TabelleWie ersetze ich Strings einer Tabelle von einer anderen Tabellenspalte

Erste Tabelle ersetzen.

ID | Value 
====================== 
1 | Fruits[Apple] 
2 | Fruits[Apple,Mango] 
3 | Apple[Red,Green] 

Zweite Tabelle

Search | Replace 
========================= 
Apple | Orange 
Green | Yellow 
+0

Normalisieren Tisch Leben viel so sein wird einfacher –

+0

Dies ist das eigentliche Design .. die Werte nur gesetzt werden zum Beispiel aber die realen Daten sind komplizierter zu betrachten .. –

Antwort

0

Sie werden irgendeine Art von rekursiven müssen ersetzt werden. so etwas wie eine Schleife

declare @t1 table (ID int, Value varchar(max)) 
declare @t2 table (Search varchar(max), ReplaceWith varchar(max)) 
insert @t1 values (1, 'Fruits[Apple]'),(2, 'Fruits[Apple,Mango]'), (3, 'Apple[Red,Green]') 
insert @t2 values ('Apple', 'Orange'),('Green', 'Yellow') 

--loop nth times for rows that have more than one match 
while exists(select top 1 * from @t1 inner join @t2 on charindex(Search, Value) > 0) 
begin 
    update @t1 
    set Value = replace(Value, Search, ReplaceWith) 
    from @t2 
    inner join @t1 on charindex(Search, Value) > 0 
end 

select * from @t1 

Ergebnisse

ID Value 
----- ----------------------- 
1  Fruits[Orange] 
2  Fruits[Orange,Mango] 
3  Orange[Red,Yellow] 

Alternativ können Sie folgende UPDATE durch Quer verbunden select-Anweisung verwenden CTE

;with CTE(ID, Value, rec_count) 
as (
    select distinct ID, Value, 1 as rec_count from @t1 inner join @t2 on charindex(Search, Value) > 0 
    union all 
    select ID, Value = replace(Value, Search, ReplaceWith), rec_count +1 
    from CTE 
    inner join @t2 on charindex(Search, Value) > 0 
) 
update @t1 
set Value= replaced.Value 
from @t1 t 
inner join 
(select distinct ID, Value 
    from CTE c 
    where rec_count > 1 
    and rec_count = (select max(rec_count) from CTE where ID = c.ID)) replaced on replaced.ID = t.ID 
0

einfach rekursiv nutzen und genießen Sie es! ;)

UPDATE tFirst 
SET  Value = REPLACE(tFirst.Value, tSecond.Search, tSecond.Replace) 
FROM 
    [First]    tFirst 
    CROSS JOIN [Second] tSecond 
Verwandte Themen