2010-11-18 20 views
2

ich zur Zeit so etwas wie diese:mysql Fall in Update-Anweisung mit REPLACE

UPDATE table1 SET column1 = REPLACE(column1, 'abc', 'abc1') WHERE column1 LIKE '%abc%'; 
UPDATE table1 SET column1 = REPLACE(column1, 'def', 'def1') WHERE column1 LIKE '%def%'; 

Ich versuche, diese in eine einzige Update-Anweisung zu konsolidieren und ich versuche, die folgende:

UPDATE table1 
SET column1 = 
CASE 
WHEN column1 LIKE '%abc%' THEN REPLACE(column1, 'abc', 'abc1') 
WHEN column1 LIKE '%def%' THEN REPLACE(column1, 'def', 'def1') 
ELSE column1 
END; 

Ist die der richtige Weg, dies zu tun? Ich bin neu im Fall/wann. Vielen Dank!

+0

Insgesamt ist die Funktionalität, die Sie verwenden sehr langsam ist. 'LIKE' ist langsamer als' MATCH ... AGAINST', was langsamer als der Vergleich der Gleichheit ist. 'CASE WHEN' ist auch langsam. Davon abgesehen - wenn Sie eine große Tabelle haben, auf die ständig zugegriffen wird, dann sind 2 UPDATEs möglicherweise bequemer, da die Tabelle weniger Zeit stilllegt. – Mikhail

+0

Warum möchten Sie die 2 Update-Anweisungen konsolidieren? Ich würde denken, dass du besser dran bist, es als 2 Updates zu tun –

+0

das Problem ist, gibt es mehr wie 20 Aussagen im Moment, ich nur aus Gründen der Einfachheit 2 eingegeben. Ist es noch besser, alle einzelnen Aussagen zu verlassen? – Dima

Antwort

3

Da Sie LIKE '%abc%' verwenden, erfordert die Update-Anweisung einen vollständigen Tabellenscan. In diesem Fall verbessert die Kombination der beiden Aussagen die Gesamtleistung. In Ihrem Vorschlag wird jedoch jede einzelne Zeile aktualisiert und die meisten von ihnen werden aktualisiert, ohne geändert zu werden (Wert von Spalte 1 wird durch Wert von Spalte 1 ersetzt).

Sie möchten sicherstellen, dass Sie die WHERE-Klausel so beibehalten, dass nur Zeilen geändert werden, die wirklich geändert werden müssen. Dieses unnötige Schreiben auf Platte ist langsamer als das Überprüfen, ob die Zeile den Kriterien entspricht.

tun:

UPDATE table1 
SET column1 = 
CASE 
WHEN column1 LIKE '%abc%' THEN REPLACE(column1, 'abc', 'abc1') 
WHEN column1 LIKE '%def%' THEN REPLACE(column1, 'def', 'def1') 
END 
WHERE column1 LIKE '%abc%' OR column1 LIKE '%def%'; 
+0

oh richtig, ich habe total vergessen, die wo in meinem Beitrag (ich habe das in meinem Code!) – Dima

+0

eine andere Frage in Bezug auf das obwohl: Dies wird nur funktionieren, wenn alle ursprünglichen Update-Anweisungen sich gegenseitig ausschließen, richtig zu beginnen? (dh keine Zeile trifft mehr als eine LIKE-Bedingung und daher wird jede Zeile nur einmal aktualisiert) – Dima

+1

@lolcat: das ist richtig. Wenn es eine Zeile gibt, die mehr als einer LIKE-Bedingung entspricht, erhält sie nur eine Aktualisierung, die erste übereinstimmende CASE. Wenn Sie beispielsweise den Wert "abcdef" hätten, würde dieser auf "abc1def" und nicht auf "abc1def1" aktualisiert. –