Försöker ersätta text i ett fält i mysql men får inte till det. All text i fältet inleds med t.ex. 'whatever - ' och vill ersätta detta med ingenting. Hittade en lösning från LarsG på ett likande problem men kan inte riktigt få det att funka för mig då de inledande orden är av olika längd.
update t set c = substring(c from X) where c like '% - '
Alternativt någon sorts trim där man tar bort det inledande...?
För det första är ditt like-uttryck felaktigt. '% - ' matchar strängar som slutar med ' - ' men inte strängar som innehåller ' - ' mitt i strängen. Jag gissar att du borde köra '% - %'.
Mitt svar är:
UPDATE t SET c = SUBSTRING(c, LOCATE(' - ', c) + 3);
WHERE c LIKE '% - %';
LOCATE(' - ', c) slänger ur sig positionen för första förekomsten av söksträngen. +3 lägger till 3 så att du hoppar över själva söksträngen. SUBSTRING plockar ut en del sträng från den angivna startpositionen till slutet. (Man kan även kontrollera längden med en tredje parameter.
Jag har ett liknande problem där jag behöver ersätta en länk som finns i tusentals poster i en MS SQL server. Är i det närmsta novis på SQL-kod och klarar inte ens att modifiera denna enkla kod för mitt ändamål. :q Jag har en tabell som heter dbo.tpc_topics. I den tabellen finns en kolumn som heter tpc_body. Den innehåller tusentals poster med en felaktig url. Jag vill alltså söka igenom den kolumnen och byta ut alla http://gammalurl.se till http://nyurl.nu. Nån som har något tips hur man modifierar scriptet för detta ändamål?
Tack Anders!
Verkligen snällt av dig att svara och dessutom så snabbt :) Din kod ser ut att vara exakt vad jag var ute efter! Dessvärre fungerar det ändå inte. Jag får följande fel:
Msg 8116, Level 16, State 1, Line 1
Argument data type ntext is invalid for argument 1 of replace function.
Texten i kolumnen är av typen ntext i en MS SQL 2005-server. Jag funderar på om det kan vara möjligt att ändra till något annat format för kolumnen, köra skriptet och sedan byta tillbaka till ntext? Kan det vara en lösning, eller behöver scriptet modifieras på något sätt? Jag kan även säga att det inte spelar någon roll om scriptet körs i hela databasen, men så vitt jag vet är det bara i just den kolumnen det behöver ändras...
Man kan, som du märkte, inte köra REPLACE på text/ntext-fält - men du kan casta om till nvarchar(max) i frågan.
Det här borde fungera:
UPDATE tpc_topics
SET tpc_body = REPLACE(CAST(tpc_body AS nvarchar(max)), 'http://gammalurl.se', 'http://nyurl.nu')
WHERE tpc_body LIKE '%[url]http://gammalurl.se%[/url]'