webForumDet fria alternativet

Ännu en sök och ersätt

Databaser & SQL

11 svar · 2 055 visningar · startad av G8

Medlem sedan jan. 20011 213 inlägg
Frågan#1

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...?

Hjälp hade vart mycket uppskattat.

//G8

Medlem sedan aug. 20039 340 inlägg
#2

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.

'Något - Mer text' blir alltså till 'Mer text'.

Medlem sedan dec. 200012 464 inlägg
#3
UPDATE t SET c = replace(c, 'Något -','') where c like 'Något -%'
Medlem sedan aug. 20039 340 inlägg
#4

LarsG, jag tror han menade att han inte vet vad som kommer innan ' - '. :)

Medlem sedan jan. 20011 213 inlägg
#5

nitro, ja du har helt rätt.. jag vet inte vad som kommer innan bindestrecket

Medlem sedan jan. 20011 213 inlägg
#6

Funkade klockrent nitro, tack för hjälpen båda två :)

Medlem sedan mars 20113 inlägg
#7

Liknande problem

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?

Medlem sedan juni 200032 967 inlägg
#8

Jag hade provat:

UPDATE tpc_topics 
SET tpc_body = REPLACE(tpc_body, 'http://gammalurl.se', 'http://nyurl.nu') 
WHERE tpc_body LIKE '%[url]http://gammalurl.se%[/url]'

mvh

Medlem sedan mars 20113 inlägg
#9

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...

Medlem sedan juni 200032 967 inlägg
#10

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]'

Mvh

Medlem sedan mars 20113 inlägg
#11

Tack :e

Nu gick det som en dans :p

Allt är ersatt utan några som helst problem! Du har varit till en otroligt stor hjälp och jag är väldigt tacksam!!!

Medlem sedan juni 200032 967 inlägg
#12

Varsågod - det är bara roligt att hjälpa till. :)

mvh

268 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)