Rolf B: Idee für Query gesucht

Beitrag lesen

Hallo Jörg,

Hat einer von Euch eine gute Idee?

Ja. Datenmodellierung. Eine solche Textspalte gehört nicht in eine Datenbank. Vor allem nicht, wenn da mehr als ein Textblock drinsteht.

Wie kommt der Text da 'rein? Durch User-Eingabe? Was machst Du bei Tippfehlern?

Wie findest Du Sätze mit einer Heizleistung von mehr als 5KW (zum Beispiel). Was ist bei 12KW? Oder 9,5?

Und wenn er Eintrag drin ist: kann es sein, dass Du den Textbaustein aktualisieren können musst? Oder entfernen? Es wird immer gruseliger.

Aber du sollst auch eine Idee für dein Konstrukt bekommen. Eine Möglichkeit wäre der Einsatz von LIKE.

UPDATE tabelle
SET text = CONCAT_WS(text, 'Strom für', n, 'KW Heizleistung')
WHERE (...Identifikation des Satzes...)
  AND text NOT LIKE '%Strom für _ KW Heizleistung%'

Du würdest also zunächst den Satz wie üblich identifizieren (über eine id oder sonst wie) und zusätzlich mit LIKE abfragen, ob ein bestimmtes Muster schon drin ist. Der Unterstrich passt nur auf genau ein Zeichen, aber hier ein % zu verwenden ist gefährlich, es könnte ja auch schon sowas drinstehen wie "Strom für Familie Müller, benötigt werden 7 KW Heizleistung". Ein % in der Mitte würde diesen Text matchen.

Du könntest jetzt sagen: SO was kommt bei mir nicht vor, aber sei gewarnt, der Teufel ist ein Eichhörnchen und seine Nüsse findest Du überall.

Eine Alternative ist der Einsatz der REGEXP_LIKE Funktion, oder ihrem Synonym, dem RLIKE Operator.

UPDATE tabelle
SET text = CONCAT_WS(text, 'Strom für', n, 'KW Heizleistung')
WHERE (...Identifikation des Satzes...)
  AND text NOT RLIKE '.*Strom für [0-9]+ KW Heizleistung.*'

Die Syntax für REGEXP-Patterns in mysql findest Du auf der verlinkten Seite weiter unten. [0-9]+ bedeutet: Ein Zeichen aus der Zeichenmenge 0-9 soll einmal oder mehrmals vorkommen. Damit würden auch 37KW Heizleistung möglich sein.

Aber: Das ist nicht gut. Es ist nicht das, was man mit einer Datenbank tut. Wie man es besser macht, kann ich Dir nicht ohne tiefere Kenntnis deiner Daten sagen. Eventuell brauchst Du zusätzliche Spalten. Oder sogar eine 1:n angeschlossene Tabelle für Zusatz-Infos. Die Aufbereitung für die Anzeige findet dann in der Anwendung statt oder einem Zugriffs-Service, meinetwegen auch in einer Stored Procedure, aber es gehört definitiv nicht in die Table.

Rolf

--
sumpsi - posui - obstruxi