SQL Befehl - Leerzeichen zwischen zwei Inhalten ersetzen

dinoldo

Cadet 4th Year
Registriert
Juni 2017
Beiträge
104
Hallo Zusammen,

ich habe in der Datenbank unterschiedliche Schreibweisen im Wort Referent: dort stehen vor dem eigentlichem Text (Namen - können unterschiedlich sein) unterschiedlicher Anzahl der Leerzeichen. Ich möchte am Ende nach dem Wort "Referenz:" nur noch ein Leerzeichen gefolgt mit restlichem Inhalt vor der Ersetzung stehen haben.

Bsp. vorher
Referent: Max Mustermann

Bsp. nachher
Referent: Max Mustermann

Das ist mein SQL-Befehl für die Änderung. Dies funktioniert, sofern der Anzahl der Leerzeichen übereinstimmt.
SQL:
UPDATE `events` SET `description` = REPLACE(`description`, 'Referent:                    ', 'Referent: ') WHERE `description` LIKE '%Referent:                    %'

Lässt sich der Befehl noch verfeinern, so dass das Ersetzen der Leerzeichen nach dem Wort "Referenz:" dynamisch ist?
Mal sind es 10 mal mehr als 10 Leerzeichen.

Danke im Voraus...

Gruß Dino
 
  • Gefällt mir
Reaktionen: nonick65
Du willst das mit dem Query einmalig für die Zukunft fixen, richtig? Also es geht nicht nur um eine Abfrage?
dinoldo schrieb:
Lässt sich der Befehl noch verfeinern, so dass das Ersetzen der Leerzeichen nach dem Wort "Referenz:" dynamisch ist?
Mal sind es 10 mal mehr als 10 Leerzeichen.
Theoretisch kannst du replaces sehr oft ineinander verschachteln.
Aber eigentlich sollte es reichen wenn du zwei aufeinander folgende spaces durch ein space ersetzen lässt.
Dieses Update Query musst du dann halt evtl. mehrfach durchlaufen lassen.
Code:
REPLACE(description,'  ', ' ')

Eine andere Variante wäre mit SUBSTRING beim ersten Leerzeichen abzuschneiden, dann den hinteren Teil per LTRIM zu kürzen und danach wieder Referent: davor zu setzen.
 
  • Gefällt mir
Reaktionen: zenokortin, Raijin, gaym0r und eine weitere Person
zenokortin schrieb:
MySQL kann regex_replace()

Wäre es vielleicht nicht sinnvoller, das "Referent" als eigene Spalte zu führen?
Ich habe in der Tabelle ca. 380 Einträge. In Feld "description" steht leider mehrzeiliger Text mit Referent: ...... welches einheitlich ersetzt werden soll.

Ich habe es mir mit REGEX_REPLACE angeschaut, bin aber nicht zum Ergebnis gekommen. ;)
Ergänzung ()

h00bi schrieb:
Du willst das mit dem Query einmalig für die Zukunft fixen, richtig? Also es geht nicht nur um eine Abfrage?

Theoretisch kannst du replaces sehr oft ineinander verschachteln.
Aber eigentlich sollte es reichen wenn du zwei aufeinander folgende spaces durch ein space ersetzen lässt.
Dieses Update Query musst du dann halt evtl. mehrfach durchlaufen lassen.
Code:
REPLACE(description,'  ', ' ')

Eine andere Variante wäre mit SUBSTRING beim ersten Leerzeichen abzuschneiden, dann den hinteren Teil per LTRIM zu kürzen und danach wieder Referent: davor zu setzen.
Ich habe ebenfalls überlegt es mehrfach auszuführen. Ist nicht perfekt, würde aber sicherlich funktionieren.
Die Variante mit SUBSTRING kenn ich noch nicht.
 
dinoldo schrieb:
Ich habe in der Tabelle ca. 380 Einträge. In Feld "description" steht leider mehrzeiliger Text mit Referent: ...... welches einheitlich ersetzt werden soll.
Wenn Referent in jeder (bzw vielen) Descriptions vorkommt, ist es nicht gut normalisiert.

dinoldo schrieb:
Ich habe es mir mit REGEX_REPLACE angeschaut, bin aber nicht zum Ergebnis gekommen.
Irgendwas Richtung:
SQL:
REGEXP_REPLACE(description, '/.*Referent:( *)[\w].*/', ' ')
Hab das aber auch grad nur aus dem Ärmel geschüttelt (keine Garantie auf Richtigkeit), sollte aber als Ansatz reichen.
 
Zuletzt bearbeitet:
Etwas in der Art vielleicht:
CONCAT('Referent: ',TRIM(REPLACE(description,'Referent:','')))

Erklärung von innen nach aussen:
Zuerst 'Referent:' entfernen
Dann mit Trim (oder was ähnliches in deine DB) die überflüssigen Leerzeichen entfernen
Zum Schluss mit Concat (oder eben ähnlich) wieder vorne 'Referent: ' hinzufügen.
 
  • Gefällt mir
Reaktionen: dinoldo
Yep, habe überlesen, dass es mehrzeiliger Text sein kann
 
Zurück
Oben