Teil eines Feldes mit SQL Query löschen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Teil eines Feldes mit SQL Query löschen

    Hi Forum!

    Mit concat ist es möglich, Felder zu ergänzen (also z.B. wenn im Feld x "bussi" steht, kann ich mit concat "bussimonster" draus machen).

    Gibts nun ein(e) SQL Query/Funktion, mit dem/der ich zum Beispiel aus diesem Feld einen Teilstring rauslösche?
    Also im konkreten Bsp. möchte ich z.B. "mons" rauslöschen, sodass nur mehr "bussiter" drin steht. Geht sowas auch ohne PHP Schleife (für jeden Datensatz)?

    Danke, bernie

  • #2
    Re: Teil eines Feldes mit SQL Query löschen

    REPLACE sollte weiterhelfen.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Oh danke, hätt ich mir eigentlich denken können, nur war ich so engstirnig und hab replace immer mit dem Replace verbunden, das statt INSERT verwendet wird.

      Danke nochmal

      Kommentar


      • #4
        Noch eine Frage:

        wenn ich in einem Feld nun z.B. "3|33|333|" stehen habe und mein Replace so aussieht replace('3|33|333|', '33|', '55|'), ergänzt er dann auch den letzten Eintrag?
        Also steht dann im Feld "3|55|55|" (falsch) oder "3|55|333|"(richtig)?

        Kanns hier jetzt nicht kurzfristig ausprobieren, drum frag ich.
        danke

        Kommentar


        • #5
          du wirst '3|55|355|' erhalten. Der Computer ist dumm, er macht einfach, was ihm aufgetragen ist, er kann nicht denken, du aber schon, vor allem logisch denken, was in diesem Fall nützlich wäre

          Kommentar


          • #6
            na ja, sehr viel denken brauch ich dann nicht mehr, da somit die Abfrage unnütz ist.
            Normalerweise ist das doch bei querys so, dass sie nach genau dem String suchen, außer du stellst ein "%" hinten oder vorne hin...

            Eine Idee, wie ich das lösen kann, dass er genau nach dem String sucht und NUR nach dem String, genauso, wie ichs ihm angebe?

            danke, lG
            bernie

            Kommentar


            • #7
              Ähm er sucht schon richtig, nur, was kann er dafür, wenn der/dein Suchbegriff besch*ssen ist, dass er kein eindeutiges Ergebnis liefern kann. Um bei dem obigen Bsp. zu bleiben, wird der Computer schon eindeutiges Ergebnis liefern, wenn du z.B. nach
              - |33|
              - |333|
              suchst. Ansonstens ist RegEx dein Freund.

              Kommentar


              • #8
                der suchbegriff ist ja nicht besch***en, da wenn ich nach z.B. "|3|" suche, der erste Wert nicht gefunden wird (weil da nur "3|" drin steht und nicht "|3|").
                Wahrscheinlich regst du dich jetzt auf, dass ich da nicht auch "|3|" reinschreib, geht aber nicht, da ich das Ganze dann in ein Array packe und ansonsten der erste Wert des Arrays 0 ist.

                Gut, da könnte ich jedes Mal den ersten Wert löschen beim Auslesen, blabla, aber ich dachte mit "like" gehts doch, warum nicht auch mit "replace".

                Schlimmstenfalls muss ichs eh umständlich und nicht elegant lösen.

                danke jedenfalls für RegEX und entschuldige meine Unwissenheit, bin noch ziemlich frisch in der tieferen SQL-Syntax und die SQL Doku ist auch nicht wirklich die beste.

                Kommentar


                • #9
                  Nö, ich rege mich da gar nicht auf, du vielleicht

                  Die MySQL-Doku ist zugegeben nicht sehr geeignet zum lernen, aber als Nachschlagewerk IMHO sehr gut

                  Kommentar


                  • #10
                    PHP-Code:
                    $delete_id "REGEXP ".$delete_id."\\|";
                    mysql_query("UPDATE $mitarbeiter SET neue_artikel=REPLACE(neue_artikel, '$delete_id', '')") or die(mysql_error()); 
                    Hi!
                    Hab das jetzt mit Regexp probiert, in verschiedenen Versionen, das will aber nicht. Im Feld "neue_artikel" steht "3|33|333|" und $delete_id soll "33|" sein.
                    Wenn ich REGEXP weglasse, löscht er, wie vermutet, zuviel raus (es bleibt dann "3|3" über).
                    Wenn ich in mein Query manuell reinschreibe
                    PHP-Code:
                    ...REPLACE(neue_artikel'REGEXP 33'''
                    passiert nix. Wenn ich das REGEXP vor das Anführungszeichen schreibe, kriege ich einen mysql Error.

                    Wie gehts denn richtig? HELP!

                    Kommentar


                    • #11
                      wenn du nur das erste vorkommen ersetzen willst, dann wird dir REPLACE m.E. nicht weiterhelfen, zitat manual:

                      Gibt die Zeichenkette zeichenkette zurück, bei der alle Vorkommen der Zeichenkette von_zeichenkette durch die Zeichenkette zu_zeichenkette ersetzt wurden

                      daran ändert sich auch nichts, wenn du das suchmuster mittels REGEX definierst.


                      was klappen könnte wäre, mit LOCATE, POSITION oder INSTR das erste auftreten des suchmusters zu ermitteln, und dann anschliessend mit SUBSTR bzw. LEFT/RIGHT die beiden teilzeichenketten vor/nach dem treffer zu ermitteln und als neuen wert zusammenzufügen ...
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #12
                        ich hab mal einen vorschlag, der mit einer vorher anzulegenden hilfsspalte zaehler funktioniert, die einfach vom typ INT ist (kann man ja nachher wieder droppen):

                        Code:
                        UPDATE tabelle
                        SET
                           zaehler = locate('xy', ersatzfeld),
                           ersatzfeld =
                              IF (zaehler=0,
                                  ersatzfeld,
                                  CONCAT (
                                       LEFT (ersatzfeld, zaehler-1),
                                       SUBSTRING (ersatzfeld, zaehler[b]+2[/b])
                                  )
                              )
                        die +2 im SUBSTRING-aufruf ist dabei durch die länge der zu "löschenden" teilzeichenkette (hier: xy) zu ersetzen.


                        liesse sich u.U. noch eleganter ohne diese hilfsspalte machen, mit einer userdefinierten variablen, aber da musst du jemanden wie Goth fragen, der das echt drauf hat - bin bei meinen versuchen jedenfalls nur auf fehler gelaufen ...
                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #13
                          Leute, ich habs hinbekommen, wahrscheinlich werdet ihr euch kaum auskennen, da es ziemlich lange und unübersichtlich
                          geworden ist, aber es funktioniert einmalig und rasend schnell! Ich probiers mal zu dokumentieren und nachvollziehbar zu machen.
                          Replace und dergleichen hab ich weggelassen.

                          Danke wahsaga für den Tipp mit LEFT/RIGHT, so hab ichs vom Prinzip her gebastelt, allerdings ohne Hilfsspalte etc.

                          das PRINZIP:
                          ich such das erste Vorkommen des Suchmusters und schreibe alles links und rechts davon wieder in die Datenbank.
                          Annahme: ich hab in der Spalte "neue_artikel" in einem Feld den Wert "7|77|777|" und möchte nur "77|" raus löschen.

                          Ich schreib euch zuerst meinen kompletten Query hin und unterteil den dann.
                          PHP-Code:
                          UPDATE $datenbank SET neue_artikel=concat(LEFT(neue_artikellocate('77|'neue_artikel)-1), SUBSTRING(neue_artikellocate('|'neue_artikellocate('77|'neue_artikel))+1)) 
                          Zuerst seh ich mir mal das erste Vorkommen des Strings an
                          PHP-Code:
                          locate('77|'neue_artikel) -> liefert 3 
                          Dann brauch ich noch die Länge des Strings. Dazu nehm ich zwei verschachtelte locate.
                          Ich setze beim zweiten locate zusätzlich die Position, ab der gesucht werden soll.
                          Diese Position ist das erste Vorkommen von "77|", in diesem Fall "3"
                          PHP-Code:
                          locate('|'neue_artikellocate('77|'neue_artikel)) -> liefert 5 
                          Jetzt weiß ich, dass ich ab der 3. Position alles links davon und ab der 5. Position alles rechts davon nehmen muss.
                          Ich muss noch vom linken Wert 1 abziehen und beim rechten 1 dazuzählen, da ansonsten von "77|"
                          "7|" übrigbleibt (nur der Siebener in der Mitte fällt weg)
                          linke Seite:
                          PHP-Code:
                          LEFT(neue_artikellocate('77|'neue_artikel)-1) -> ergibt "7|" 
                          rechte Seite (mittels Substring):
                          PHP-Code:
                          SUBSTRING(neue_artikellocate('|'neue_artikellocate('77|'neue_artikel))+1) -> ergibt "777|" 
                          jetzt bastle ich das Ganze einfach mit concat zusammen
                          PHP-Code:
                          concat(linke_seiterechte_seite
                          wenn ihr die entsprechenden Seiten einsetzt, kommt ihr zu obigem Query, also nochmal mein Endquery:
                          PHP-Code:
                          UPDATE $datenbank SET neue_artikel=concat(LEFT(neue_artikellocate('77|'neue_artikel)-1), SUBSTRING(neue_artikellocate('|'neue_artikellocate('77|'neue_artikel))+1)) 
                          Bin für Verbesserungen und Kommentare jeder Art dankbar!
                          Jetzt aber guats Nächtle!
                          bernie

                          Kommentar

                          Lädt...
                          X