Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi SQL Parser in Delphi (https://www.delphipraxis.net/16452-sql-parser-delphi.html)

Tyrael Y. 17. Feb 2004 11:37


SQL Parser in Delphi
 
Ich müsste für SQL-Queries rauskriegen, was im Statement hinter der WHERE-Klausel steht, um
diese Inforamtionen im weiteren Verlauf zu verwenden.

Ne einfache Lösung über Pos(), klappt in den meisten Fällen, aber..

... der Tabellenname könnte z.B. BlaSülzWhere oder BlaWhereSülz oder WhereBla heißen
... ein Feldname könnte genauso aufgebaut sein

..dies kann ich von vorherein leider nicht voraussetzen.

Hat einer von euch vielleicht eine Idee, wie man das geschickt lösen könnte?

Leuselator 17. Feb 2004 12:40

Re: SQL Parser in Delphi
 
Das Beispiel geht von der Annahme aus, das einem WHERE zwingend ein Leerzeichen folgt (leider kann dem WHERE ein #13#10 vorangehen):

Delphi-Quellcode:
var
  FirstPos,
  LastPos : Integer;
  UGotTheFirst,
  UGotTheLast,
  ThereAreMany : Boolean;
  QueryText : String;
begin
  FirstPos    := 0;
  LastPos     := 0;
  FirstPos    := pos('WHERE ',UPPERCASE(QueryText));
  UGotTheFirst := (FirstPos > 0);
  LastPos     := FirstPos;
  while pos('WHERE ',copy(UPPERCASE(QueryText),LastPos,MaxInt)) > 0 
    do LastPos := pos('WHERE ',copy(UPPERCASE(QueryText),LastPos,MaxInt));
  UGotTheLast := (LastPos > 0);
  ThereAreMany := (FirstPos <> LastPos);
end;
Gruß

Tyrael Y. 17. Feb 2004 13:07

Re: SQL Parser in Delphi
 
Danke dir für deinen Hilfeversuch, aber deine While-Schleife solltest du vielleicht nochmal überdenken, da Sie nicht gerade sehr schnell ist und letztendlich auch kein Ergebnis für mein Problem liefert.

danke trotzdem

Alexander 17. Feb 2004 13:54

Re: SQL Parser in Delphi
 
Mhm. Aber Leuselator hat dir doch den richtigen Weg genannt, such einfach nach WHERE mit vorangestellten und nachgestellten Leerzeichen, statt einfach nach WHERE.

PS: Du musst auch wie Leuselator es geacmht, alles auf GROSS oder klein Buchstaben bringen, weil man ja das WHERE schreiben kann wie man will ;-)

Tyrael Y. 17. Feb 2004 14:22

Re: SQL Parser in Delphi
 
Ein einfaches Gegenbeispiel wann es nicht klappen kann:

SELECT * FROM "Test" WHERE("ID" = '123')

:(

Leuselator 17. Feb 2004 14:33

Re: SQL Parser in Delphi
 
Lass das Leerzeichen halt weg.
Wenn Du meinen Code dann noch so änderst, funktioniert er auch (ausserdem ist die Whileschleife keineswegs langsam - sie wird maximal so oft durchlaufen, wie "Where" im statement vorkommt-1, d.h. bei einem "Where" wird sie nichtmal starten)!
Delphi-Quellcode:
var
  FirstPos,
  LastPos : Integer;
  UGotTheFirst,
  UGotTheLast,
  ThereAreMany : Boolean;
  QueryText : String;
begin
  FirstPos    := 0;
  LastPos     := 0;
  FirstPos    := pos('WHERE',UPPERCASE(QueryText));
  UGotTheFirst := (FirstPos > 0);
  LastPos     := FirstPos;
  while pos('WHERE',copy(UPPERCASE(QueryText),LastPos+5,MaxInt)) > 0
    do LastPos := LastPos+5+pos('WHERE',copy(UPPERCASE(QueryText),LastPos+5,MaxInt));
  UGotTheLast := (LastPos > 0);
  ThereAreMany := (FirstPos <> LastPos);
end;
Gruß

Tyrael Y. 17. Feb 2004 14:59

Re: SQL Parser in Delphi
 
ehm, also..

..wenn du zB. ein SQL-Staement hättest das folgendermaßen aussieht:

SELECT "FromWhere" FROM "WhereAbouts" WHERE("WhereLocal" = 'Northwhere')
Edit: Es könnte auch genausogut ohne anführungszeichen geschrieben worden sein
-> SELECT FromWhere FROM WhereAbouts WHERE(WhereLocal = Northwhere)

..ich gebe zu ist ein Extrembeisspiel ;)

und letztendlich wäre das von mir gewünschte Ergebnis 'WHERE("LocalWhere" = 'Northwhere')'

...mit deiner Möglichkeit wäre die zurückgegebene Position nicht gleich meiner Wunschmenge

danke dir trotzdem für deine Mühe :)

Leuselator 17. Feb 2004 16:24

Re: SQL Parser in Delphi
 
Es schreit, es zappelt und es wird fürchterlich an den Haaren herbeigezogen :-)
Also im Ernst: Beim Schreiben von SQLStatements und erst recht bei der Benennung von Tabellen und Feldern sollte man doch wenigstens die Finger von reservierten ausdrücken lassen und ein paar Formatierungsstandards einhalten. Aber wie dem auch sei - einzige Alternative ist, wirklich einen SQL-parser zu schreiben - und das ist 'ne Menge Arbeit, nach deren Sinn man schonmal fragen dürfte.
Viel Glück bei der Lösung und Gruß aus Berlin

Tyrael Y. 17. Feb 2004 16:30

Re: SQL Parser in Delphi
 
Das Problem ist, ich kann nicht voraussetzen was für Statements abgegeben werden und muss wie der gute Murphy vom schlimmsten Fall ausgehen. :roll:

Danke noch mal vielmals für deine Mühe.

Ich werde wahrscheinlich einen Freeware-Parser nutzen.
Muss mal gucken, was es da alles gibt.


Viele Grüße
Tyrael

trifid 17. Feb 2004 20:27

Re: SQL Parser in Delphi
 
schau mal unter
http://www.delphi-groups.de/YaBBSe/i...threadid=17611


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz