Abfrage mysql
Kron
- datenbank
0 Kron0 Cheatah0 Kron0 Alexander (HH)0 Kron
0 Kron0 Alexander (HH)0 Kron
Moin,
gibt es eine Möglichkeit, in eine where-Klausel einen Split mit Delimiter zu integrieren?
Ich bearbeite nämlich gerade eine Tabelle, die ungünstigerweise in der "where-Spalte" (wenn auch sehr selten) nicht einen Eintrag hat, sondern per Delimiter getrennt 2 oder 3 Einträge.
Alternativ müsste ich nämlich ein Script schreiben, dass mit die Tabelle umorganisiert und auch alle anderen Scripte darauf anpassen.
Ciao, Rolf Kron
P.S: LIKE %% ginge, aber nur, wenn es eine Option "whole word only" oder sowas gäbe.
Grüße, Rolf Kron
P.S: LIKE %% ginge, aber nur, wenn es eine Option "whole word only" oder sowas gäbe.
Like %word% ist das Gegenteil von whole word only ;-)
Überdenke Dein Design und alles wird gut. Kannst ja trotzdem wiederkommen.
Viele Grüße,
Horst Hottig
Like %word% ist das Gegenteil von whole word only ;-)
Nicht wirklich, aber egal.
Überdenke Dein Design und alles wird gut.
Es ist nicht mein Design. Und so "klug", dass es diese Idee suboptimal ist, war ich auch vor meinem Post. Trotzdem danke für Deine Antwort.
Hi,
gibt es eine Möglichkeit, in eine where-Klausel einen Split mit Delimiter zu integrieren?
Daten einer Tabellenzelle sind atomar.
Ich bearbeite nämlich gerade eine Tabelle, die ungünstigerweise in der "where-Spalte" (wenn auch sehr selten) nicht einen Eintrag hat, sondern per Delimiter getrennt 2 oder 3 Einträge.
Normalisiere die Daten. Du möchtest vermutlich eine 1:n-Beziehung aufbauen, vielleicht auch n:m.
Cheatah
Normalisiere die Daten. Du möchtest vermutlich eine 1:n-Beziehung aufbauen, vielleicht auch n:m.
Ich weiß, dass das der vordergründig vorhandene Knackpunkt ist. Hintergründig betrachtet stimmt es aber nicht ganz.
Es geht nur um einen winzigen Zusatznutzen, der bei weitem unter dem Nutzen der durchweg normalisierten Daten geht.
Auch der Verzicht auf auf diesen Zusatznutzen ist wertiger als die vermeintliche Normalisierung der Daten.
Würde ich nämlich, bezogen auf diese Spalte, die Daten normalisieren, würde ich die Datenbankin der Datenmenge maßgeblich aufblähen.
Falls also keiner hier den Geniestreich auf Lager hat, verzichte ich zugunsten der Datenmenge auf den Zusatznutzen.
THX, Rolf Kron
Moin Moin!
Normalisiere die Daten. Du möchtest vermutlich eine 1:n-Beziehung aufbauen, vielleicht auch n:m.
Ich weiß, dass das der vordergründig vorhandene Knackpunkt ist. [...]
Würde ich nämlich, bezogen auf diese Spalte, die Daten normalisieren, würde ich die Datenbankin der Datenmenge maßgeblich aufblähen.
Warum soll eine Normalisierung die Daten aufblähen? Sauber durchnormalisiert jonglierst Du nur ein paar 32-Bit- oder 64-Bit-Integer durch die Gegend, und hast keine (oder kaum noch) Redundanzen.
Die Daten NICHT normalisiert zu speichern erzeugt früher oder später einen Wartbarkeitsalbtraum:
Ich quäle mich gerade mit einem alten Stück Software herum, dessen "Schöpfer" sich aus Denkfaulheit nahezu jede Normalisierung "gespart" hat. Das Ergebnis ist eine Datenbank mit riesigen Redundanzen und an sehr vielen Stellen fünffach kopiertem Programmcode (Teilweise sind ganze Module fünffach vorhanden!), wo eine normalisierte DB mit einer einfachen For- oder While-Schleife hätte bedient werden können.
Das sieht dann sinngemäß pro Routine so aus:
SELECT Produktnummer, Sollzahl_Haus_1, Istzahl_Haus_1, ... FROM Produkte ...
Berechne etwas aus dem Ergebnis über 50 Zeilen Code
SELECT Produktnummer, Sollzahl_Haus_2, Istzahl_Haus_2, ... FROM Produkte ...
Berechne etwas aus dem Ergebnis über 50 Zeilen Code
SELECT Produktnummer, Sollzahl_Haus_3, Istzahl_Haus_3, ... FROM Produkte ...
Berechne etwas aus dem Ergebnis über 50 Zeilen Code
SELECT Produktnummer, Sollzahl_Haus_4, Istzahl_Haus_4, ... FROM Produkte ...
Berechne etwas aus dem Ergebnis über 50 Zeilen Code
SELECT Produktnummer, Sollzahl_Haus_5, Istzahl_Haus_5, ... FROM Produkte ...
Berechne etwas aus dem Ergebnis über 50 Zeilen Code
Das zieht sich so durch mehrere Megabytes Programmcode und über irgendwas zwischen 50 und 200 DB-Tabellen.
Normalisiert würde die entsprechende Routine so aussehen:
for (i=1; i<=5; i++) {
SELECT Produktnummer, Hausnummer, Sollzahl, Istzahl, ... FROM Produkte ... WHERE Hausnummer=i
Berechne etwas aus dem Ergebnis über 50 Zeilen Code
}
Oder mit einem günstigen Problem schlicht:
SELECT Produktnummer, Hausnummer, func1(Sollzahl), func2(Istzahl), ... FROM Produkte ... GROUP BY Produktnummer, Hausnummer
Die "magische" Zahl Fünf kommt aus der Idee, die Software würde nie mehr als fünf "Häuser" bedienen, ursprünglich gab es sogar nur zwei. Heute sind es irgendwas zwischen 20 und 30 "Häuser", organisiert in Gruppen mit jeweils maximal fünf "Häusern". Natürlich sollen irgendwann alle "Häuser" in einer Gruppe stecken, und es sollen noch mehr "Häuser" dazu kommen.
Erschwerend kommt dazu, dass es über ein Jahrzehnt nicht ein Stück Dokumentation und absolut keine Historie des Codes gibt, abgesehen von einigen strukturlosen Kommentaren im Code. SCCS, CVS, SVN, VSS, git, alles Fremdworte, nie gehört, nie gesehen. Und auf Nachfragen hört man dann auch nur noch "Wieso? Das steht doch alles im Code."
Zur Eleganz des Codes des Codes sei nur gesagt: "If the Only Tool You Have is a Hammer, Then Every Problem is a Nail." Der Code macht Kopfschmerzen, insbesondere wenn man weiß, dass der Code produktiv läuft. Zum Glück ist das monatliche Schmerzensgeld ganz annehmbar.
Alexander
Die "magische" Zahl Fünf kommt aus der Idee, die Software würde nie mehr als fünf "Häuser" bedienen, ursprünglich gab es sogar nur zwei. Heute sind es irgendwas zwischen 20 und 30 "Häuser", organisiert in Gruppen mit jeweils maximal fünf "Häusern". Natürlich sollen irgendwann alle "Häuser" in einer Gruppe stecken, und es sollen noch mehr "Häuser" dazu kommen.
Ich habe Ähnliches auch schon übernehmen müssen/dürfen.
Horror.
Was meine Fragestellung aber angeht, ist die Regex in der Abfrage sehr vertretbar. Und wenn ich mal ganz viel Zeit habe, passe ich die Scripte an und normalisiere diese Tabelle neu. Der rest sieht indes sehr passabel aus.
Danke für die Diskussion und frohes Schaffen
Rolf Kron
Meine Lösung:
REGEX '[[:<:]]word[[:>:]]'
Ciao, Rolf Kron
Moin Moin!
Meine Lösung:
REGEX '[[:<:]]word[[:>:]]'
Hast Du eine grobe Vorstellung, welche Last Du der DB damit aufbürdest? Laß mal spaßeshalber EXPLAIN laufen und fang an zu weinen.
Normalisierung ist der einzig saubere Weg.
Alexander
Hast Du eine grobe Vorstellung, welche Last Du der DB damit aufbürdest? Laß mal spaßeshalber EXPLAIN laufen und fang an zu weinen.
Woher willst Du wissen, wieviele Einträge ich damit scanne?
Also von Last und "weinen" muss nicht zwingend die Rede sein.