| Autor |
Beitrag |
mcst09
      
Beiträge: 112
|
Verfasst: Mo 11.09.06 10:27
Hallo,
ich habe in jedem Datensatz die Felder LÄNGE und BREITE. Meine Where-Klausel wird dynamisch zusammengesetzt. An die Klausel werden zwei Zahlen übergeben (z.B. 0 und 30). Bisher war mein SELECT so aufgebaut, dass dann in der Where-Klausel gefragt wurde, ob die LÄNGE zwischen 0 und 30 liegt.
Jetzt soll aber nicht die Länge, sondern die größere der beiden Zahlen (also LÄNGE oder BREITE) selektiert wird. Also ob LÄNGE (oder Breite) zwischen 0 und 30 liegt.
Beispiel:
In einem Datensatz ist Länge = 22 und Breite = 29
Dann soll ermittelt werden, dass die Breite größer ist und vergleichen wird, ob die Breite zwischen 0 und 30 liegt. Was hier der Fall wäre.
Das ganze sollte man möglichst in dem SELECT-String machen, also nicht erst wenn man die Daten schon hat, um sie danach abzufragen.
Hat jemand Ideen??
Danke
Axl
|
|
uwewo
      
Beiträge: 154
|
Verfasst: Mo 11.09.06 12:19
Ich weiß nich mit welcher Version Du arbeitest.
< 5.1 wäre es mit if möglich
>=5.1 würde ich es mit CASE versuchen
Bsp: < 5.1
SQL-Anweisung 1:
| select if(Breite>Länge,Breite,If(Breite<Länge,Länge,'')) |
ungetestet
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 11.09.06 13:19
Versuch's mal mit SELECT * FROM xyz WHERE MAX(LÄNGE, BREITE) INBETWEEN 0, 30;
Bin mir aber bei der Syntax von INBETWEEN grad nicht sicher ... SSchau da ggf. nochma nach.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
mcst09 
      
Beiträge: 112
|
Verfasst: Mi 13.09.06 08:03
Hallo Ihr Zwei,
also ich habe jetzt beide Vorschläge einmal ausprobiert.
unwewo: Bei Deinem Vorschlag bekomm ich immer die Fehlermeldung die Du im Anhang findest. Habe folgende Zeile in meinem SQL-String mit eingebaut:
Delphi-Quelltext 1: 2: 3:
| aWhereStr := aWhereStr + lAND + '(IF(C.CutLength > C.CutWidth, C.CutWidth, IF(C.CutLength < C.CutWidth, C.CutWidth, '')) > ' + edLengthStart.Text ')';
aWhereStr := aWhereStr + lAND + '(IF(C.CutLength > C.CutWidth, C.CutWidth, IF(C.CutLength < C.CutWidth, C.CutWidth, '')) < ' + edLengthEnd.Text ')'; |
benBE: Deinen Vorschlag verstehe ich ned zu ganz. Der SQL-Funktion MAX kann man doch nur einen Parameter übergeben (zB: MAX(Breite)). Dann liefert diese Funktion mir die größte Breite in der ganzen Tabelle, nicht in dem Datensatz.
Oder sehe ich da was falsch? Jedenfalls hat er mir Dein Vorschlag ned angenommen, weil es angeblich zu viele Parameter sind in der MAX-Funktion.
Delphi-Quelltext 1:
| aWhereStr := aWhereStr + lAND + 'MAX(C.CutLength, C.CutWidth) INBETWEEN ' + edLengthStart.Text + ' AND ' + edLengthEnd.Text + ')'; |
Danke
Axl
Einloggen, um Attachments anzusehen!
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 13.09.06 09:14
Bei Sybase SQL Anywhere müsste eigentlich folgendes Statement funktionieren (wenn ich mich recht entsinne):
SQL-Anweisung 1:
| SELECT IF CUTLENGTH > CUTWIDTH THEN CUTLENGTH ELSE CUTWIDTH ENDIF AS MAXVALUE FROM TABELLE |
|
|
uwewo
      
Beiträge: 154
|
Verfasst: Mi 13.09.06 16:58
Hi Axl,
hast Du mal nur mein Beispiel ausprobiert?
Du wirst sehen es funktioniert!
Alle anderen Fehler liegt am Syntax Deiner SQL Abfrage
Außerdem warum das IF in der Where Abfrage, durch
SQL-Anweisung 1:
| select if(Breite>Länge,Breite,If(Breite<Länge,Länge,'')) |
zeigt er Dir nur diese Datensätze an die Breiter bzw. Länger sind.
Danach kannst Du immer noch WHERE verwenden.
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 13.09.06 19:36
@uwewo: Bist Du sicher, das Sybase SQL Anywhere diese Syntax unterstützt?
|
|
uwewo
      
Beiträge: 154
|
Verfasst: Mi 13.09.06 19:46
SQL Anywhere, Sorry dachte aus irgendeinem Grund es wäre MySQL!
Werde mich aber trotzdem schlau machen und wieder eine Antwort posten!
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 13.09.06 20:10
@uwewo: Du brauchst nur ein wenig weiter oben zu schauen... 
|
|
uwewo
      
Beiträge: 154
|
Verfasst: Mi 13.09.06 20:10
Tja ganz klar ist es mir immer noch nicht welche SQL DB verwendet wird,
sollte es SQL AnyWhere sein habe ich hier einen Link zur "IF" Funktion
vielleicht hilft es ja was.
www.ianywhere.com/de...dbrfde9/00000431.htm
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 13.09.06 20:15
uwewo hat folgendes geschrieben: | | Tja ganz klar ist es mir immer noch nicht welche SQL DB verwendet wird, [...] |
Schau Dir die gepostete Fehlermeldung an...
Und wegen der Syntax des IF-Statements in Sybase SQL Anywhere...siehe oben...aber das sagte ich ja bereits... 
|
|
uwewo
      
Beiträge: 154
|
Verfasst: Mi 13.09.06 20:40
| Zitat: |
Und wegen der Syntax des IF-Statements in Sybase SQL Anywhere...siehe oben...aber das sagte ich ja bereits...  |
Ja klar habe nicht auf die Fehöermeldung so genau geachtet, ging aber auch aus dem eigentlichen Thread nicht hervor. 
|
|
|