preload
Aug 15

Man meint ja, wenn es etwas gibt, was Computer besonders gut können, dann ist es Rechnen. Im Allgemeinen trifft das ja auch zu und auch in diesem speziellen Fall war das Problem letztendlich vor dem Monitor, aber vielleicht hilft der Hinweis hier, dass 2 oder 3 Menschen weniger mit diesem Effekt zu kämpfen haben.

Generell ist unsere bevorzugte Datenbank-Plattform ja Oracle und damit kommen wir auch ganz gut klar. In manchen Fällen müssen wir uns aber auch z.B. mit dem Microsoft SQL-Server® befassen. Und dabei bin ich vor kurzem auf eine Eigenheit des SQL-Servers gestoßen, die mir bislang so nicht bewusst war. Bei Oracle liefert ein Statement der Art

select 8 / 5 from Table

das Ergebnis 1,6. Das gleiche Ergebnis erhält man auch, wenn man zwei Number-Spalten miteinander dividiert, die eben diese Zahlen beinhalten.
Der SQL-Server hingegen ist der festen Meinung, dass das richtige Ergebnis erst einmal nur 1 ist. Der simple Grund dafür: Bei reinen Integerwerten gibt der SQL-Server auch einen reinen Integerwert zurück (den er leider nicht einmal rundet, sondern nur abschneidet). Mein Matheleher hätte mich wohl hochkant aus dem Kurs geworfen mit solchen Rechenkünsten. Aber wie schon erwähnt, steht es auch so in der Dokumentation zum SQL-Server (http://msdn.microsoft.com/de-de/library/ms175009.aspx) und somit kann ich niemandem einen Vorwurf machen, außer mir selbst.
Falls man dem SQL-Server doch zu einer richtigen Berechnung überreden möchte (mit dessen Ergebnis auch mein Mathelehrer einverstanden wäre), muss man mindestens einen der Operanden als Float-Wert darstellen.

select 8 / 5.0 from Table

Bzw. eben mit einem entsprechenden Type-Casting bei den Spalten.

Tja, man lernt eben nie aus und kann auch in der Mathematik immer wieder neue Überraschungen erleben.

2 Responses to “SQL-Server und Rechnen”

  1. kerberos Says:

    Das von MS-SQL produzierte Verhalten ist richtig.

    Ist in C++ übrigens ganz genauso.

  2. admin Says:

    Unter “richtig” verstehe ich eben etwas Anderes. Es ist nachvollziehbar, aber eben in meinen Augen definitiv nicht richtig. Nach den mir bekannten Gesetzen der Mathematik muss ich eben nicht sagen, dass ich 8 durch 5,0 teilen möchte, sondern es genügt 8 durch 5 zu teilen, um 1,6 zu erhalten.
    Wenn ich eine solche Rechnung bei einer typisierten Programmiersprache durchführe und mein Ergebnis in einer Integer-Variablen speichern möchte, kann ich verstehen, dass entweder ein Laufzeitfehler auftritt oder das Ergebnis tatsächlich so gerundet wird. Aber bei einer SQL-Abfrage habe ich nun mal keine typisierte Ergebnisspalte.

Leave a Reply