"csv"-Wert aus varchar löschen

"csv"-Wert aus varchar löschen

am 09.01.2007 21:27:49 von Jan Rademacher

Hallo,
gibt eine einfache Möglichkeit aus einer varchar Spalte mit z.B. den
Werten 1,12,3,456 per UPDATE die 3 zu entfernen,
oder muss ich jeden Wert "WHERE in '3'" auslesen und dann updaten ?

ich hoffe Ihr versteht was ich meine

lg und thx

Re: "csv"-Wert aus varchar löschen

am 10.01.2007 07:33:45 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: "csv"-Wert aus varchar löschen

am 10.01.2007 09:16:25 von Christian Kirsch

Jan Rademacher schrieb:
> Hallo,
> gibt eine einfache Möglichkeit aus einer varchar Spalte mit z.B. den
> Werten 1,12,3,456 per UPDATE die 3 zu entfernen,
> oder muss ich jeden Wert "WHERE in '3'" auslesen und dann updaten ?
>

Die Frage deutet darauf hin, dass Du ein nicht-normalisiertes Modell
verwendest. Das solltest Du reparieren, sonst läufst Du immer wieder
gegen die Wand.

Andreas' Vorschlag funktioniert mit MySQL so leider nicht, da es kein
Replace für Regexen kennt. Eine normale REPLACE-Funktion existiert mW
(die Dokumentation weiß da sicher mehr) - damit müsstest Du ",3," durch
"," ersetzen, etwa so:

UPDATE bla SET fasel = replace(fasel,",3,",",")
WHERE fasel LIKE ",3,"

Wie immer hilft die Lektüre der Dokumentation beim Klären der Details.

Re: "csv"-Wert aus varchar löschen

am 10.01.2007 13:03:54 von Jan Rademacher

Hallo Alle zusammen,
für Alle die an einer, in meinen Augen ziemlich gelungenen Lösung
interessiert sind, möchte ich an dieser Stelle auf einen Lösungsansatz
unter http://www.unreal-forum.de/showpost.php?p=2342220&postcount= 12
hinweisen.

mit freundlichen Grüßen
Jan Rademacher

Re: "csv"-Wert aus varchar löschen

am 10.01.2007 14:13:13 von Harald Fuchs

In article ,
Jan Rademacher writes:

> Hallo Alle zusammen,
> für Alle die an einer, in meinen Augen ziemlich gelungenen Lösung
> interessiert sind, möchte ich an dieser Stelle auf einen Lösungsansat=
z
> unter http://www.unreal-forum.de/showpost.php?p=3D2342220&postcoun t=3D12
> hinweisen.

Naja, ich würde das nicht "ziemlich gelungene Lösung" nennen, sondern
"vermutlich funktionierender Würgaround für ein total hirnverbranntes
Datenmodell". Die gelungene Lösung heißt immer noch Normalisierung.

Re: "csv"-Wert aus varchar löschen

am 10.01.2007 15:22:31 von Jan Rademacher

Harald Fuchs schrieb:
>...für ein total hirnverbranntes Datenmodell...

Dankeschön...

Re: "csv"-Wert aus varchar löschen

am 10.01.2007 18:23:21 von Claus Reibenstein

Christian Kirsch schrieb:

> UPDATE bla SET fasel = replace(fasel,",3,",",")

Leerzeichen an den richtigen Stellen erhöhen die Lesbarkeit. Gerade
dieser Fall ist ein Paradebeispiel dafür:

UPDATE bla SET fasel = replace(fasel, ",3,", ",")

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /

Re: "csv"-Wert aus varchar löschen

am 10.01.2007 18:49:48 von dafox

Harald Fuchs schrieb:
> In article ,
> Jan Rademacher writes:

>> Hallo Alle zusammen,
>> für Alle die an einer, in meinen Augen ziemlich gelungenen Lösung
>> interessiert sind, möchte ich an dieser Stelle auf einen Lösungsansatz
>> unter http://www.unreal-forum.de/showpost.php?p=2342220&postcount= 12
>> hinweisen.

> Naja, ich würde das nicht "ziemlich gelungene Lösung" nennen, sondern
> "vermutlich funktionierender Würgaround für ein total hirnverbranntes
> Datenmodell". Die gelungene Lösung heißt immer noch Normalisierung.

ACK. Das ist genau das, was ich mir auch gedacht habe, als ich das OP
gelesen hatte. Wäre das Modell durchdacht, dann hätte sich die Frage
vermutlich niemals gestellt, weil die Lösung dann trivial wäre.

Aber wenn ich mir die Beiträge in dem genannten Forum so anschaue, dann
ist die Mühe sowieso vergebens. Der OP wurde dort auch darauf hin
gewiesen, dass das Datenmodell nicht normalisiert ist und seine Reaktion
darauf:

,-------
| ja, es ist nicht ganz die feine Art, und normalerweise normalisiere
| ich auch, aber in diesem Fall erschien es mir einfach praktischer, es
| sind immer nur 2-3 "csv"-Werte, da kann nicht sooviel passieren.
|
| Selbst vBulletin nutzt sowas noch - für MICH reicht das als
| Rechtfertigung, da ich diese Software doch als ziemlich ausgereift und
| die Jungs da für recht clever halte"

Wie praktisch das ist, hat er ja selber gemerkt...

Re: "csv"-Wert aus varchar löschen

am 10.01.2007 18:50:52 von Sebastian Suchanek

Thus spoke Jan Rademacher:
> Harald Fuchs schrieb:

>> ...für ein total hirnverbranntes Datenmodell...
>
> Dankeschön...

Wo er recht hat, hat er recht. So eine CSV-Liste in einem
Datenbankfeld schreit einem geradezu "kaputtes Datenmodell"
entgegen.

Ich weiß, wovon ich rede: Ich habe so etwas früher selbst einmal
"verbrochen" und durfte es dann Jahre später schlußendlich
dadurch büßen, daß ich die Datenbankstruktur, die Datensätze und
die dazugehörigen Skripte doch auf eine bessere Struktur
migriert habe. Das lief zumindest bei den Skripten auf völlige
Neuschreiben hinaus, die Datensätze konnte ich mit ein paar SQL-
Statements zumindest halbautomatisch "konvertieren".


HTH,

Sebastian

--
http://www.baumaschinen-modelle.net
http://www.schwerlast-rhein-main.de

Re: "csv"-Wert aus varchar löschen

am 10.01.2007 19:09:07 von dafox

Jan Rademacher schrieb:

> für Alle die an einer, in meinen Augen ziemlich gelungenen Lösung
> interessiert sind, möchte ich an dieser Stelle auf einen Lösungsansatz
> unter http://www.unreal-forum.de/showpost.php?p=2342220&postcount= 12
> hinweisen.

Das das keine Lösung bzw. kein Lösungsansatz ist weisst du ja bereits.
Weil's so schön ist, hier noch was, das keine SPs benötigt. Löscht aus
dem Datensatz mit der ID '4711' die Zahl '3' aus der Liste.

SET @s = '3';
SET @id = '4711';

UPDATE tabelle SET feld = IF(
SUBSTRING(feld, 1, LENGTH(CONCAT(@s, ','))) = CONCAT(@s, ','),
/* THEN */
SUBSTRING(feld, LENGTH(CONCAT(@s , ',')) + 1),
/* ELSE */
IF(
SUBSTRING(feld, LENGTH(feld) - LENGTH(CONCAT(',', @s)) + 1,
LENGTH(CONCAT(',', @s))) = CONCAT(',', @s),
/* THEN */
SUBSTRING(feld, 1, LENGTH(feld) - LENGTH(CONCAT(',', @s))),
/* ELSE */
REPLACE(feld, CONCAT(',', @s, ','), ',')
)
)
WHERE id = @id AND feld REGEXP CONCAT('(^|,)', @s, '(,|$)')

Da liegt der Vorteil von normalisierten Daten doch auf der Hand, oder?

Re: "csv"-Wert aus varchar löschen

am 11.01.2007 16:44:07 von Christian Kirsch

Claus Reibenstein schrieb:
> Christian Kirsch schrieb:
>
>> UPDATE bla SET fasel = replace(fasel,",3,",",")
>
> Leerzeichen an den richtigen Stellen erhöhen die Lesbarkeit. Gerade
> dieser Fall ist ein Paradebeispiel dafür:
>
> UPDATE bla SET fasel = replace(fasel, ",3,", ",")

Oh, Danke für diesen Hinweis. Allerdings retten die Leerzeichen den Kram
ja nun auch nicht wirklich - 3 am Anfang und Ende des Feldes ersetzt er
nicht.

Der *eigentliche* Fehler ist das Datenmodell, aber das hatten wir ja schon.