Stimmt der SQL update Befehl hier?

Hallo Experten,

ich suche gerade nach einem SQL Befehl. Der mir meine URL in der Spalte updated.
Leider bin ich schon ein bischen eingerosted.
Ich hab URLs in der Spalte wie: www.yyyy.de/… und möchte diese durch www.xxx.at/… ersetzen. Also nur den yyyy.de Teil dahinter soll die Info bleiben.

Ich würde das so machen:
UPDATE TABLE
SET COLUMN=‚www.xxx.at
WHERE =‚www.yyyy.de‘;

Stimmt das bleibt dann der angehängte Teil der URL gleich?

Lg,
Chris

Hallo Chris,

kann an deinem SQL-Statement keinen Fehler finden.

schönen Gruß
Stefan

Hallo!

Ich kann die Frage leider
nicht beantworten.

Grüsse

Hallo,
ich würde es so ähnlich versuchen:

UPDATE TABLE
SET = ‚www.‘ || substr(, 5, LENGTH()-7) || ‚.at‘
WHERE MATCHES ‚www.*.de‘;

Je nach verwendeter DB kann es auch sein, dass der Verknüpfungsoperator „||“ nicht unterstützt wird und statt dessen CONCAT() o.ä. zu benutzen ist.

Hallo Chris,
wenn in der Spalte
www.yyyy.de/fo.php&w=1&e=2
steht wird Dein SQL
"UPDATE TABLE
SET COLUMN=‚www.xxx.at
WHERE =‚www.yyyy.de‘;
keine Zeile betreffen, da vermutlich in keiner Spalte allein „www.yyyy.de“ steht.

auch ein Update mit „like“ ‚%yyyy%‘ wird Dich nicht weiterbringen, da das update genau das tut, was es aussagt, es wird „www.xxx.at“ durch den aktuellen Eintrag ersetzen. Damit zerstötst Du Dir die Links genauso.

Ich kenne Dein DBMS nicht, aber ich würde es mit einem Zwischenscript lösen:

  • einlesen,
  • SQLs generieren,
  • prüfen,
  • committen.

Baer

SET COLUMN=‚www.xxx.at
WHERE =‚www.yyyy.de‘;

„where column = …“ meintest Du sicherlich …

Moin moin,

der Updatebefehl führt genau das aus, was da steht. Das ist aber nicht das, was in der Frage formuliert wurde.

Was in der Frage formuliert wurde müsste etwa so formuliert werden:

UPDATE tablename
SET columnname = ‚[www.xxx.at‘||MID(columnname](http://www.xxx.at’%7C%7CMID(columnname), LEN('www.yyy.de’) + 1)
WHERE columnname LIKE ‚www.yyy.de%

Denn in der Frage steht, dass von einer URL, etwa

der vordere Teil ersetzt und der Rest beibehalten werden soll, also etwa so

Hallo,

a)
In der where-Klausel fehlt noch der Name der Spalte, deren Werte mit
www.yyyy.de‘ verglichen werden sollen, also

update beispiel
set url = ‚www.xxx.at
where url = ‚www.yyyy.de

Dieser Befehl würde jetzt in der Tabelle „beispiel“ in allen Zeilen,
deren Spalte „url“ den Wert ‚www.yyyy.de‘ enthält, die Spale „url“ mit dem Wert
www.xxx.at‘ überschreiben. URLs, die noch weitere Zeichen enthalten,
z.B. ‚http://www.yyyy.de/test‘ werden durch diesen Befehl NICHT geändert,
weil die WHERE-Klausel nur Zeilen erfasst, in denen EXAKT die
angegebene Zeichenkette steht, kein Zeichen mehr oder weniger.

b)
Will man nur einen Teil einer Zeichenkette ersetzen, dann kann man
für die Suche LIKE und Wildcard-Operatoren wie ‚%‘ verwenden für die
Änderung muss man die gefundene Zeichenkette leider selber auseinander
und wieder zusammen bauen. In Oracle gibt es z.B. eine SUBSTR-Funktion,
mit der man Teile von Zeichenketten extrahieren kann:

update beispiel
set url = ‚http://www.xxx.at‘ || substr(url,length('http://www.yyyy.de’)+1+1))
where url like ‚http://www.yyyy.de%

In der set Zeile wird der Anfang der neuen URL ‚http://www.xxx.at‘ mit dem
Ende der alten url (das macht die SUBSTR-Funktion) verbunden.
Die WHERE-Klausel sucht nach allen Zeilen, in denen url mit dem alten Wert
beginnt. Dies funktioniert nur bei urls, die außer dem Suchbegriff noch
mindestens ein weiteres Zeichen enthalten. Bei URLs, die keine weiteren Zeichen
enthalten, sollte folgendes reichen:

update beispiel
set url = ‚http://www.xxx.at
where url = ‚http://www.yyyy.de

Man kann de Wirkung auch vorab mit einem SELECT testen:

select url as alt, ‚http://www.xxx.at‘ || substr(url,length('http://www.yyyy.de’)+1+1)) as neu
from beispiel
where url like ‚http://www.yyyy.de%

Als Ergebnis erhält man eine Tabelle, bei der in der ersten Spalte der unveränderte
url-Wert steht, in der zweiten Spalte der Wert, wie er nach dem Update aussehen würde.
Ist das Ergebnis o.k., kann man das eigentliche Update abschicken.

Die SUBSTR-Funktion gibt es meines Wissens nicht bei allen Datenbanken unter diesem
Namen. Ggf. in der Doku der Datenbank nachschlagen, wie diese Funktion dort heißt.
Der ||-Operator heißt auch manchmal CONCAT(String1, String2).

Hallo Chris,

Da der zu ersetzende Part Teil eines Strings ist, bitte versuche folgendes Beispiel:
http://stackoverflow.com/questions/605768/search-and…

Cheers,
Steffen

hi,
dein code wird so nicht klappen…
probier mal

UPDATE TABLE SET COLUMN=‚www.xxx.at‘ || substr(column, 10, length(column) -10) WHERE substr(column, 1, 10) = ‚www.yyyy.de‘;

die Syntax kann je nach Datenbank unterschiedlich sein aber so oder ähnlich sollte es klappen. ist der zu ersetzende teil dynamisch sein wirds natürlich komplizierter…

gruß
kaym

Nein, funktioniert so nicht weil du einen exakten Vergleich machst. Mehr so:

UPDATE TABLE
SET COLUMN='www.xxx.at’||substr(column,11)
WHERE column like ‚www.yyyy.de%‘;

also: wenn die Spalte mit ‚www.yyyy.de‘ Anfaengt, dann ersetze sie mit ‚www.xxx;at‘ plus allem was noch in der Spalte ab Position 11 steht (www.xxx.at sind 10 Zeichen).

Hallo,
mit der Bedienung von wer-weiss-was komme ich nicht zurecht. Ich habe bestimmt nicht angegeben, dass ich etwas von SQL verstehe. Wer-weiss-was bittet, trotzdem zu antworten. Nun ja. Das ist meine Antwort. Tut mir leid.
Gruß

Hallo Chris

Wenn die Tabelle Table und die Spalte Column heisst passt das fast. In der Where Bedingung fehlt einfach noch die Spalte. Sie würd dann korrekt so aussehen:

WHERE COLUMN = ‚www.yyyy.de‘;

Wenn Du nicht sicher bist, würde ich dir vorschlagen mit Transactions zu arbeiten. Das könnte dann so aussehen:
/**1. Datensicherung
SELECT * INTO TABLE_YYYYMMDD
FROM TABLE WHERE COLUMN = ‚www.yyyy.de‘;
**/

/**2. Upate
BEGIN TRAN up_tab
UPDATE TABLE
SET COLUMN=‚www.xxx.at
WHERE COLUMN = ‚www.yyyy.de‘;
**/

/**3. Check **/
SELECT *
FROM TABLE WHERE COLUMN = ‚www.yyyy.de‘;

/**4. Bestätigung oder Wiederherstellung
–COMMIT TRAN up_tab
–ROLLBACK up_tab
**/

LG jorge

Nein. Mit SQL kann man nur den kompletten Spalteninhalt ändern. Leider muss man für diesen Fall erst die Werte mit SELECT auslesen und mit UPDATE zurück schreiben.

Hallo,

Dir fehlt in Deinem Query noch das REPLACE.

Der Befehl muß wie folgt aussehen:

UPDATE TABLE
SET COLUMN = REPLACE(COLUMN, ‚www.yyyy.de‘, 'www.xxx.at’)
WHERE COLUMN like ‚www.yyyy.de%‘;

Bitte aber vorher unbedingt testen!

Beste Grüße
Michael