Patrick257: Teilstring ersetzten mit SQL ?

Hey zusammen,

folgendes:

Ich habe eine MySQL Datenbank mit einer Tabelle über Dateinamen und Dateipfade.

Etwa so:

filename          filepath

apa.pdf           files/apa.pdf
license.txt       files/2/license.txt
readme.txt        files/uid6/readme.txt
goal setting.doc  files/uid1/goal setting.doc

Der Pfad jeder Datei soll nun derart geändert werden, dass files/ durch /home/dev/ ersetzt wird.

Ergo: /home/dev/apa.pdf
      /home/dev/2/license.txt usw usf.

Gibt es einen SQL-Query(und falls die Kurzantwort "Ja" lautet, wie lautet dieser?), der dies bewerkstelligt?

Vielen Dank schon einmal!

Groetjes,
Patrick

  1. Hallo Patrick,

    Der Pfad jeder Datei soll nun derart geändert werden, dass files/ durch /home/dev/ ersetzt wird.

    Ergo: /home/dev/apa.pdf
          /home/dev/2/license.txt usw usf.

    Gibt es einen SQL-Query(und falls die Kurzantwort "Ja" lautet, wie lautet dieser?), der dies bewerkstelligt?

    ja, in MySQL kannst Du das z.B. mit den Zeichenkettenfunktionen SUBSTR() und CONCAT() lösen. Andere Zeichenkettenfunktionen kämen auch in Frage.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz,

      ja, in MySQL kannst Du das z.B. mit den Zeichenkettenfunktionen SUBSTR() und CONCAT() lösen. Andere Zeichenkettenfunktionen kämen auch in Frage.

      Danke soweit - ich bastele gerade etwas mit UPDATE SET = ... und REPLACE().

      Ich weiß, hier wird das "SELF ist der Mann/die Frau" zurecht betont - trotzdem: Wer mir hier schnell mit besseren SQL Fähigkeiten als den Meinen ein fertiges SQL Statement passend zur Aufgabe weiter oben produzieren kann, ist sich meines EWIGEN Dankes sicher. Jede Minute, die ich heute nachmittag sparen kann, kann ich in den Bastel-Foto-Kalendar für Omas 80igsten Geburtstag stecken!  :-)

      Groetjes,
      Patrick

      1. Konkret:

        Wie kann ich in einem UPDATE Statement auf den jeweils aktuellen Inhalt des Feldes zugreifen? Ich kann schon einmal zeigen, wie es NICHT geht:

        UPDATE files2 SET filepath
        = REPLACE((SELECT filepath FROM files2),'files/','/home/dev/')

        Warum nicht? Wie geht's richtig?

        1. echo $begrüßung;

          Wie kann ich in einem UPDATE Statement auf den jeweils aktuellen Inhalt des Feldes zugreifen?

          Indem du einfach dessen Namen notierst. Zur Not, weil das ein Bezeichner ist, in Backticks.

          Beispielsweise erhöht ein UPDATE ... SET feld = feld + 1 das Feld feld um 1.

          Ich kann schon einmal zeigen, wie es NICHT geht:
          UPDATE files2 SET filepath = REPLACE((SELECT filepath FROM files2),'files/','/home/dev/')
          Warum nicht?

          Das Subselect, so wie du es notiert hast, liefert den den Inhalt des Feldes filepath aller Datensätze der Tabelle, nicht nur einen einzelnen Wert.

          echo "$verabschiedung $name";

      2. Hello,

        Danke soweit - ich bastele gerade etwas mit UPDATE SET = ... und REPLACE().

        Replace() bedeutet, den Datensatz zu verändern, wenn er vorhanden war und ihn anderenfalls neu einzufügen. Das wird nicht das sein, was Du wolltest.

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        1. echo $begrüßung;

          Danke soweit - ich bastele gerade etwas mit UPDATE SET = ... und REPLACE().
          Replace() bedeutet, den Datensatz zu verändern, wenn er vorhanden war und ihn anderenfalls neu einzufügen. Das wird nicht das sein, was Du wolltest.

          Er meint die Funktion REPLACE() (auch zu erkennen an den dahinter notierten Klammern) und nicht das gleichnamige Statement.

          echo "$verabschiedung $name";

          1. Er meint die Funktion REPLACE() (auch zu erkennen an den dahinter
            notierten Klammern) und nicht das gleichnamige Statement.

            Richtig - aber mit Toms Version (concat, substr) hat es auch wunderbar geklappt - MERCI beaucoup (das hängt damit zusammen, dass ich gerade in einem anderen Thread über französische Schweinereien gestolpert bin ;) ).

          2. Hello,

            Danke soweit - ich bastele gerade etwas mit UPDATE SET = ... und REPLACE().
            Replace() bedeutet, den Datensatz zu verändern, wenn er vorhanden war und ihn anderenfalls neu einzufügen. Das wird nicht das sein, was Du wolltest.

            Er meint die Funktion REPLACE() (auch zu erkennen an den dahinter notierten Klammern) und nicht das gleichnamige Statement.

            Ach, sorry.
            Ich kannte dafür nur "stuff()" und das kennt MySQL ja nicht ;-)
            Ich hätte aber nachschauen können in der Funktionsübersicht und entschuldige mich hiermit für meine Schlampigkeit. *duck*

            http://dev.mysql.com/doc/refman/5.1/en/func-op-summary-ref.html

            Aber nach dem Lesen der Doku dünkt mir, dass das nicht die passende Funktion für Patrick257 ist.

            Harzliche Grüße vom Berg
            http://bergpost.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  2. Hello,

    filename          filepath

    apa.pdf           files/apa.pdf
    license.txt       files/2/license.txt
    readme.txt        files/uid6/readme.txt
    goal setting.doc  files/uid1/goal setting.doc

    Der Pfad jeder Datei soll nun derart geändert werden, dass files/ durch /home/dev/ ersetzt wird.

    Ergo: /home/dev/apa.pdf
          /home/dev/2/license.txt usw usf.

    update $tabelle set filepath = if(substring(filepath,1,6)='files/',concat('/home/dev/',substring(filepath,7,255)),filepath);

    oder

    update $tabelle set filepath = concat('/home/dev/',substring(filepath,7,255)) where substring(filepath,1,6)='files/';

    Gibt bestimmt noch mehr Möglichkeiten.
    Zweiteres würde ich bevorzugen.

    Bitte an Vinzenz, es zu kontrollieren :-)

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)