Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-CASE wird immer für alle Ausdrücke geprüft? (https://www.delphipraxis.net/134032-sql-case-wird-immer-fuer-alle-ausdruecke-geprueft.html)

PASST 14. Mai 2009 10:23

Datenbank: ADS • Version: 9.10 • Zugriff über: Advantage Komponenten

SQL-CASE wird immer für alle Ausdrücke geprüft?
 
Hallo allerseits,

ich habe eine Frage, die sich nicht auf Delphi, sondern auf SQL des ADS Advantage Datenbase Server bezieht.

Ich habe ein SQL-Statement der folgenden Form:
SQL-Code:
SELECT
 CASE feld_A
  WHEN 1 THEN feld_B / feld_C
  WHEN 2 THEN feld_B / feld_D
 END
FROM tabelle
Es gilt, wenn feld_A = 2 dann feld_C = 0. feld_D ist immer > 0.

Wenn ich diese Abfrage am Datenbankserver ausführe, wird immer eine Fehlermeldung 'Division by zero' angezeigt. Es scheint, dass der ADS-SQL-Server die Berechnung immer und für jeden Fall/Ausdruck durchführt, egal ob die Bedingung zutrifft oder auch nicht.

Kann mir das jemand bestätigen oder habe ich am ADS irgendwas falsch eingestellt?

Kann ich das Problem nur umgehen, indem ich das folgende, recht umständliche mache:
SQL-Code:
...WHEN 1 THEN (CASE feld_C WHEN 0 THEN 0 ELSE feld_B / feld_C END) END...

Gruß,
Peter

joachimd 14. Mai 2009 15:28

Re: SQL-CASE wird immer für alle Ausdrücke geprüft?
 
IIRC ist das so, wie Du beschreibst. Konfigurieren kann man das nicht.
Aber Du könntest es in eine UDF verpacken und damit elegant umgehen (ungetestet!):

SQL-Code:
create function div_null(div1 integer, div2 integer)
returns integer
begin
  if div2=0 
    then return NULL;
    else return div1/div2;
  endif;
end;

PASST 14. Mai 2009 15:46

Re: SQL-CASE wird immer für alle Ausdrücke geprüft?
 
Ist das denn ein Phänomen, welches nur beim ADS auftritt oder betrifft es auch andere SQL-Server?

Deine Lösung mit einer UDF ist natürlich ein elegantes Umschiffen des Problems.

omata 14. Mai 2009 20:50

Re: SQL-CASE wird immer für alle Ausdrücke geprüft?
 
Zitat:

Zitat von PASST
Es gilt, wenn feld_A = 2 dann feld_C = 0. feld_D ist immer > 0.

Ist das auch wirklich so?

Wenn wirklich ja, dann vielleicht so...
SQL-Code:
SELECT feld_B / CASE WHEN feld_C = 0 THEN feld_D ELSE feld_C END
FROM tabelle

PASST 15. Mai 2009 06:54

Re: SQL-CASE wird immer für alle Ausdrücke geprüft?
 
Das sollte so immer gelten und somit wäre der Umbau des SQL-Strings korrekt.

Aber ich denke, dass der Vorschlag eine UDF einzusetzen, sinnvoller ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:52 Uhr.

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