REPLACE match

Tommy57

Erfahrenes Mitglied
Hallo,

ich habe ein einfaches Statement, wo ich einen Text nach Wörtern durchsuche mit LIKE '%...%'. Ich verwende utf8_general_ci, wodurch Groß/Kleinschreibung und Sonderzeichen keine Probleme machen. Nun möchte ich den Treffer aus dem String entfernen, da spielt REPLACE wohl scheinbar nicht mit, da möglicherweise das Wort anders geschrieben ist.

Kann mir da jemand weiterhelfen, wie ich recht simpel den durch LIKE '%...%' getroffenen Teil im String entfernen kann?

Gruß, Tommy

Hier mal ein Beispiel:
Ich habe folgenden Satz "Zlatan Ibrahimovic 2016 ► The Monster - Crazy Skills & Goals |HD". In der Datenbank trifft die Zeile mit "Zlatan Ibrahimović" dank utf8_general_ci. Aber durch das Accent über dem c, greift nun leider keine mir bekannte Such-Funktion, die Substrings ersetzt oder mit die Position des Treffers anzeigt.

Ich hätte eine Idee, wie man das vllt lösen könnte, aber ich glaub, da fehlt mir das Wissen etwas.

Meine Überlegung ist, da ich ja die getroffene Phrase habe und es lediglich nur um eine einzige Zeile geht, könnte ich doch solange links einen Buchstaben abschneiden, bis LIKE '...%' trifft, danach schneide ich solange rechts alle Buchstaben ab, bis LIKE '...' trifft. Dann habe ich doch exakt die Phrase, die ich entfernen muss?!

Kann mir da jemand bei der Umsetzung etwas helfen?
 
Zuletzt bearbeitet von einem Moderator:
Konnte das Problem nun selber lösen. Hab zwei Funktionen geschrieben, die soweit ich das beurteilen kann, das Problem lösen:

Code:
DELIMITER $$
CREATE FUNCTION getMatchedPhrase(title VARCHAR(2048), str VARCHAR(255)) RETURNS VARCHAR(2048)
BEGIN
  DECLARE phrase VARCHAR(2048);
  SET phrase = title;
  
  IF (CHAR_LENGTH(phrase) = 0 OR phrase NOT LIKE CONCAT('%', str, '%')) THEN RETURN ''; END IF;
  
  WHILE (CHAR_LENGTH(phrase) > 0 AND phrase NOT LIKE CONCAT(str, '%')) DO
  SET phrase = SUBSTR(phrase, 2);
  END WHILE;
  
  WHILE (CHAR_LENGTH(phrase) > 0 AND phrase NOT LIKE str) DO
  SET phrase = SUBSTR(phrase, 1, CHAR_LENGTH(phrase) - 1);
  END WHILE;
  
  RETURN phrase;
END$$
DELIMITER ;

Code:
DELIMITER $$
CREATE FUNCTION replacePhrase(title VARCHAR(2048), search_str VARCHAR(255), replace_str VARCHAR(255)) RETURNS VARCHAR(2048)
BEGIN
  DECLARE phrase VARCHAR(2048);  
  SET phrase = getMatchedPhrase(title, search_str);
  
  WHILE (CHAR_LENGTH(phrase) > 0 AND CHAR_LENGTH(title) > 0) DO
  SET title = REPLACE(title, phrase, replace_str);
  SET phrase = getMatchedPhrase(title, search_str);
  END WHILE;
  
  RETURN title;
END$$
DELIMITER ;

Falls jemand eine bessere Idee hat, würde ich mich natürlich drüber freuen.

Gruß, Tommy
 
Zuletzt bearbeitet:
Hi sheel,

ich habe mir die beiden Funktionen zusammen geschustert. Mich würde aktuell die Meinung interessieren, ob man das so machen kann, oder ob das völlig daneben ist. Vllt gibt es da ja auch eine ganz einfache Lösung.

Gruß, Tommy
 
Zuletzt bearbeitet:
Meinte eigentlich das nicht funktionierende Replace vorher.
Weil eigentlich sollte das trotzdem funktionieren...
 
Nee, leider ja nicht. Kann man ja einfach testen:

Code:
SELECT REPLACE('Niño', 'nino', ''); -- Output: 'Niño'

Ich hätte halt gerne, dass er das Wort ersetzt. Ich möchte alle Treffer, die ich durch eine Suche mit LIKE bekomme aus dem String entfernen. Ziel ist, den Satz nach bestimmten Schlüsselwörtern zu durchsuchen, da darf es dann nicht an einem Sonderzeichen scheitern.
 
Der Output zur gezeigten Anweisung ist ja auch richtig :rolleyes:
Da Niño kein nino enthält wurde nichts ersetzt.

ñ ist nun mal nicht n, auch für die Spanier nicht.
 
Zuletzt bearbeitet:
Hi sheel,

es kommt auf den Zeichensatz an. Wenn ich mit utf8_general_ci arbeite, zeigt mir die Datenbank durchaus 'Niño' als Treffer, sogar wenn ich nach Gleichheit mit 'nino' prüfe. Es muss doch irgendwie möglich sein, den Teilstring zu ersetzen?!

Gruß, Tommy
 
Zurück