webForumDet fria alternativet

Temptabell!?

5 svar · 452 visningar · startad av Peeer

PeeerMedlem sedan mars 20025 362 inlägg
#1

Hej!
Har en tabell ("info") som innehåller en herrans massa poster. En del av dessa poster (dock långtifrån alla) innehåller data som jag vill ersätta med annan data. Detta löser jag för nuvarande på följande sätt:

UPDATE info SET infokolumn = REPLACE(infokolumn, 'prefix_INFO', 'prefix2_NYINFO') WHERE infokolumn LIKE '%prefix_INFO%';
UPDATE info SET infokolumn = REPLACE(infokolumn, 'prefix_INFO2', 'prefix2_NYINFO2') WHERE infokolumn LIKE '%prefix_INFO2%';
UPDATE info SET infokolumn = REPLACE(infokolumn, 'prefix_INFO3', 'prefix2_NYINFO3') WHERE infokolumn LIKE '%prefix_INFO3%';

osv..

Detta fullständigt suger musten ur maskinen (konstigt:OO ) så jag letar nu efter alternativa vägar. Min tanke var att jag skulle minska ner mängden data som måste sökas igenom varje gång, genom att först skapa en temporär tabell som innehåller alla poster som innehåller "prefix_". Denna temporära tabell skulle jag sedan söka igenom på samma sätt som ovan (med replace) för att sedan slå ihop "info" med temptabellen igen. Detta borde väl ge en rätt stor prestandavinst?

Frågan är nu hur jag gör detta?

  1. Kopiera all data som innehåller "%prefix_%" till "tabell2".
  2. Slå ihop "tabell2" och "info" igen och se till så att alla rader i "info" som har samma ID som motsvarande rad i "tabell2" skrivs över.

DBMS: MySQL 4.0

LarsGMedlem sedan dec. 200012 465 inlägg
#2
UPDATE info 
SET infokolumn = 
case 
when infokolumn  like '%prefix_INFO3%'
then REPLACE(infokolumn, 'prefix_INFO3',prefix2_NYINFO') 
when infokolumn  like '%prefix_INFO2%'
then REPLACE(infokolumn, 'prefix_INFO2',prefix2_NYINFO') 
when infokolumn  '%prefix_INFO%'
then REPLACE(infokolumn, 'prefix_INFO',prefix2_NYINFO') 
end
WHERE infokolumn LIKE '%prefix_INFO%';
PeeerMedlem sedan mars 20025 362 inlägg
#3

Hmm, intressant lösning. Fungerar förhoppningsvis bättre än min nuvarande. :)

PeeerMedlem sedan mars 20025 362 inlägg
#4

Ja snabbare går det utan tvekan, dock så strular det lite om man har flera satser som ska ersättas i samma post. Den ersätter bara en av dem. Visst går det att köra sql-satsen flera gånger (tills man ser att "affected rows" == 0), men går det att ändra i sql-satsen istället så vore ju det bättre. :)

LarsGMedlem sedan dec. 200012 465 inlägg
#5

Använd flera replace i så fall

replace(
REPLACE(infokolumn, 'prefix_INFO3',prefix2_NYINFO') ,
'anna själv','tredje')

tänk även på ordningen mellan olika when

PeeerMedlem sedan mars 20025 362 inlägg
#6

Ja så kan man ju göra :) Tackar!

Genererad på 374 ms · cache AV · v20260730165559-full.f96bc7eb