SQL Statement mit Hilfe von regular exporessions parsen?
Bechte
- perl
0 Rolf Rost0 Klaus Mock
Hallo Leute,
hier ist eine wirklich kniffelige Aufgabe:
Ich arbeite in einem Datewarehouse Team, sprich wir verwalten alle Systemdaten unserer Firma und liefern den Leuten aus Vertrieb und Marketing Listen mit aktuellen Statistiken, Zahlen, Fakten, etc.
Aufgrund einer Systemumstellung soll ermittelt werden, welche Felder und Datenbanken am häufigsten verwendet werden.
Unsere Berichtszentrale habe ich schon soweit ausgekitzelt, dass sie mir eine Liste aller Queries zurückliefert, die automatisiert ablaufen. Nun habe ich über ein Perl-Script diese Daten in einen Hash geschaufelt. (Dabei habe ich alle Whitespaces in einfach Leerzeichen umgewandelt, dh. kommt in einem SQL-Statement ein Zeilenumbruch oder mehrere Leerzeichen hintereinander vor, wird daraus ein Leerzeichen gemacht.) Der Hash-Key ist der Name des Query, der Wert das SQL Statement:
$queries{'beispielsql1'} = "SELECT Tab1.Feld1 as "Kunde", Tab2.Feld1 as "Lieferant", SUM(Tab1.Wert) as "Umsatz" FROM DB1.Tab1 Tab1 LEFT OUTER JOIN DB2.Tab2 Tab2 ON Tab1.Fremdindex=Tab2.Feld1 WHERE Tab1.Wert>100 GROUP BY Tab1.Feld1, Tab2.Feld1 HAVING SUM(Tab1.Wert) > 10000 ORDER BY 1, 2";
Das wäre beispielsweise ein Query, das mir eine Überstellung Kunde, Lieferant liefert, mit allen Kunden-Lieferanten-Kombinationen, die über einen Verkaufswert von 10000 liegen.
Gibt es eine regular expression, die mir die Feldliste, die angesprochenen Tabellen, Joins, die Whereclause, Group by, Having und Order by entsprechend aufdröselt??!
Ich habe mich daran versucht, aber das gelieferte Ergebnis ist nur bis zu den angesprochenen Tabellen richtig...
$muster = 'select (distinct )?(.*?) from (.*?)(( (left|right))?( (inner|outer))? join .*?)( where (.*?))?( group by (.*?))?( having (.*?))?( order by (.*?))?';
Nun dachte ich, dass ich mit einem m// arbeiten könnte und als Rückgabewerte folgendes erhalten würde:
$selectfelder = $2;
$fromtabellen = $3;
$allejoins = $4;
$wherebedingungen = $10;
$groupbedingungen = $12;
$havingbedingungen = $14;
$orderfelder = $16;
Leider funktioniert das nicht sauber, dh. die Selectfelder und die fromtabellen werden noch gefüllt, der Rest bleibt <undef>. Hat jemand eine Idee, wie ich das schnell und unkompliziert lösen kann???
Vielen Dank für Eure Hilfe, gerne auch per Email an:
mail ~at~ bechte ~dot~ de
Grüße Bechte
Hallo ,
Gibt es eine regular expression, die mir die Feldliste, die angesprochenen Tabellen, Joins, die Whereclause, Group by, Having und Order by entsprechend aufdröselt??!
Also ich würde, wenn ich wüsste, was als eigentliche Aufgabe ansteht, nach einer anderen Lösung schauen.
It means: Möglicherweise mal den Ansatz überdenken.
Gruss, Rolf
Hallo ,
Gibt es eine regular expression, die mir die Feldliste, die angesprochenen Tabellen, Joins, die Whereclause, Group by, Having und Order by entsprechend aufdröselt??!
Also ich würde, wenn ich wüsste, was als eigentliche Aufgabe ansteht, nach einer anderen Lösung schauen.
It means: Möglicherweise mal den Ansatz überdenken.
Gruss, Rolf
Hallo Rolf,
danke für diesen Tipp ;o)
Ich habe den Fehler aber gefunden. Simple as it seems, dem guten Ausdruck fehlte "NUR" ein absoluter Schlusspunkt. Ein eingrenzen in ^ ... $ brachte das erwünschte Ergebnis :o)
Man muss ja nicht immer alles gleich über den Haufen werfen. Aber im Prinzip gebe ich Dir recht: Wenn man nicht weiter kommt, neuen Ansatz suchen. Aber hier lag der Fehler zum Greifen nahe, da werf ich die Flinte nicht ins Korn.
Noch zur Info:
Wir müssen ermitteln, wie oft jedes Feld aller unserer Datenbanken verwendet wird. Sprich, da ich alle SQL-Queries in einer Datei habe und diese mittels meinem Perl Programm in eine saubere Form gebracht habe, kann ich nun eine Auswertung fahren. Dazu gehe ich wie folgt vor:
Ich splitte das SQL-Statement, zerteile alle Tabellen und Joins und schreibe die Kurznamen dafür weg. Dann gehe ich auf die selektierten Felder, zerteile Sie und ersetze für jedes den Kurz- oder Langnamen (falls vorhanden, meist bei mehreren Tabellen) und ermittel so, aus welcher Datenbank welches Feld kommt. Geschrieben werden die Sätze in Excel im Format: Query, Datenbank, Tabelle, Feld, Beschreibung
Mittels Excel lassen sich dann nette Pivotfunktionen dazu anwenden, mit den Daten vielerlei Auswertungen zu treiben...
Grüße
Bechte
Hallo Bechte,
danke für Dein Feedback!
Nur mal kurz noch zu meiner 'Philosophie': Ich hab die Erfahrung gemacht, dass ich als Entwicker um so schneller vorwärts komme, je länger ich ein Projekt durchdenke _ohne einen Tastaturanschlag_ gemacht zu haben.
Was dann 'noch' aufhält sind Details beim Umsetzen - und da hänge ich auch manchmal fest. Aber da ist es manchmal eben ganz gut, darüber nachzudenken ob es vielleicht nicht doch gaaaaaanz ganz anders geht...
Schönes WE!
Rolf
Hallo,
Gibt es eine regular expression, die mir die Feldliste, die angesprochenen Tabellen, Joins, die Whereclause, Group by, Having und Order by entsprechend aufdröselt??!
Es gibt sogar (mindestens) ein Perl-Modul, das Dir dabei helfen kann, nämlich http://search.cpan.org/~jzucker/SQL-Statement-1.09/
Grüße
Klaus