Anmelden

View Full Version : SQL: NULL als Ergebnis bei vielen Nachkommastellen



Booley
30-03-12, 11:27
Hallo zusammen,

ich habe folgendes Phänomen:
Bei der Multiplikation von Feldern mit sehr vielen Nachkommastellen erhalte ich im SQL-Editor kein Ergebnis.

Zur Veranschaulichung:

Wenn ich dieses SQL (unter Grün) abschicke, bekomme ich richtiger Weise 8 als Ergebnis zurück:
SELECT 2.0000000000 * 2.0000000000 * 2.0000000000 as Ergebnis
FROM Tabelle

Wenn ich jetzt noch eine 0 ergänze, bekomme ich NULL als Ergebnis zurück:
SELECT 2.0000000000 * 2.0000000000 * 2.00000000000 as Ergebnis
FROM Tabelle

Nächster Effekt:
SELECT 50.0000000000000 * 20.00000000000000
from tabelle
-> funktioniert

Jetzt eine Nachkommastelle dazu:
SELECT 50.00000000000000 * 20.00000000000000
from tabelle
-> NULL

Jetzt wieder das gleich SQL von oben:
SELECT 50.0000000000000 * 20.00000000000000
from tabelle
-> auch NULL

SQL beenden, neu starten, gleiches SQL -> funktioniert

Man kann sehen, dass das Ergebnisfeld mit 27 Nachkommastellen noch ausgegeben wird, bei 28 ist wohl bei diesem Beispiel Schluss. Und das Ergebnisfeld wird nicht wieder verkleinert, wenn ich eine 0 wieder weg nehme, sondern erst, wenn ich die Session schließe. Alternativ muss ich viele Nachkommastellen entfernen, dann geht es wieder.

Hat noch jemand dieses Phänomen, oder gar eine Lösung dafür?

Betriebssystem ist übrigens 6.1


Gruß
Markus

Robi
30-03-12, 11:38
Habs grade mal in 7.1 versucht,
reagiert identisch

it's not a trick, it's a feature

Robi

andreaspr@aon.at
30-03-12, 11:50
Hallo,

habs bei 6.1 und 7.1 probiert und der erste Effekt tritt auch bei mir auf.
Den zweiten Effekt konnte ich jedoch nicht nachvollziehen.
Wenn ich mit F9 den zuvor korrekten ausgegebenen Select wieder hole, wird wieder die Abfrage korrekt ausgegebenen.
Vielleicht hast du eventuell nicht mit F9 die Abfrage geholt, sondern einfach nur hineinkopiert ohne die bestehende zeile mit den Nullen vorher zu löschen?

B.Hauser
30-03-12, 11:54
Versuch mal folgendes, je nachdem in welcher Umgebung Du das aufrufst:
1. iSeries Navigator --> Verbindung --> JDBC --> Dezimal Länge und Nachkommastellen auf 63 stellen. (funktioniert bei mir sogar auf V5R4).
2. Emedded SQL oder SQL Programmierung -->über ein SET OPTION-Statement Option DECRESULT
3. Im STRSQL kann man das soweit ich gesehen habe nicht setzen.

Birgitta

andreaspr@aon.at
30-03-12, 11:56
Wenn du im STRSQL die Werte vorher mit CAST definierst, funktioniert es auch.

SELECT cast (50.0000000000000000000 as dec (35, 30)) * cast
(20.00000000000000000000 as dec (35, 30))
from sysibm.sysdummy1

Fuerchau
30-03-12, 12:15
Bei großen Ergebnis/Zwischenfeldern war schon immer ein Cast erforderlich:

dec( dec(Wert1, n1, m1) * dec(Wert2, n2, m3), nE, mE)

Ggf. "round(Erg, m)" nicht vergessen, sonst wird abgeschnitten.

Booley
30-03-12, 12:37
Okay, ich dachte schon, ich wäre zu blöde für ein einfaches Sql. Dann werde ich daraus mal eine "Casting-Show" machen. :rolleyes:

@andreaspr@aon.at: Ich habe das SQL mit F9 wieder geholt, aber mit diesem Effekt kann ich gut leben, da zum Einen das Problem mit einem Cast ja weg ist und zum Anderen ich im "richtigen Leben" Felder multipliziere, welche sich nicht mal eben in der Größe ändern. :cool:

@B.Hauser: Ich bin immer noch gerne im guten, alten STRSQL unterwegs. Den gleichen Effekt konnte ich im Surveyer auch feststellen und daher habe ich dann andere Editoren nicht mehr versucht.

Vielen Dank für die schnellen Antworten und ein schönes Wochenende!

Markus