Bechte: SQL Statement mit Hilfe von regular exporessions parsen?

Beitrag lesen

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.

Meine Frage nun:

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