Die Syntax für SUBSTR Skalar effektiv SUBSTR(expression, start-pos, for-length)
IBM i 7.1->Database->Reference->SQL reference->Built-in functions->Scalar functions->SUBSTR
Die Länge ist() Ausdruck im OP verwendet dargestellt ist für das zweite Argument angegeben ; d.h. das Start-Pos-Argument. Als Ausgangsposition ist das Ergebnis dieser string-length minus five
Berechnung inkorrekt zum Erhalten der Daten ganz links; d.h. die Startposition ist fünf Bytes kleiner als die Länge der Kette. Das würde natürlich einige unbedeutende Nullen fünf Bytes vom Ende der String-Darstellung des Dezimal-Ergebnisses der Division lokalisieren.
Als wirksame Korrektur würde daher entweder von
seine • Setzen Sie den konstanten ganzzahligen Wert von 1
für das Start-po Argument [wodurch die Länge() expression Das dritte Argument wird]
• den SUBSTR Skalar mit dem Ersetzen LINKER Skalar.
Jede dieser Revisionen würde etwas erreichen, das mindestens dem entspricht, was als die gewünschte Ausgabe angedeutet wird. Doch ohne DDL und die explizite Ausgabe im OP könnte die tatsächliche Wirkung dieser überarbeiteten Ausdrücke nur erraten werden.
Wie auch immer, selbst bei jeder dieser Änderungen bleiben die vorgeschlagenen alternativen Zeichenkettenausdrücke aufgrund des Fehlens eines expliziten Castings als ähnlich schlechte [herannahende] Auswahl von Ausdrücken wie die im OP; das heißt die beiden überarbeiteten Ausdrücke als möglicherweise korrigierende vorgeschlagen [noch wünschenswerte Ergebnisse, die ähnlich unwahrscheinlich bleiben ergeben] sind:
SUBSTR((F4105.COUNCS/10000), 1,length((F4105.COUNCS/10000)-5))
LEFT((F4105.COUNCS/10000),length((F4105.COUNCS/10000)-5))
Nachdem festgestellt Datentyp \ Längenattribute mit explizitem casting [d.h. selbst in einem abgeleiteten Tabellenausdruck, der die Eingabewerte generiert, die die im OP angezeigte Ausgabe erzeugen würden, aus einer Liste literaler numerischer Werte, stellt der Zeichenfolgenausdruck in der folgenden Abfrage dies sicher nur die elf Dezimalstellen rechts vom Dezimalpunkt [ddie Skala] wird beibehalten; Der Effekt besteht darin, dass die abschließenden fünf Ziffern abgeschnitten werden:
with F4105 (COUNCS) as (values
(dec( 1111643. , 9, 2))
,(dec( 1111633. , 9, 2))
,(dec( 1111633. , 9, 2))
,(dec( 1017654. , 9, 2))
,(dec( 1017654. , 9, 2))
,(dec( 1127258. , 9, 2))
)
SELECT cast( dec((F4105.COUNCS/10000), 17, 11) as varchar(19))
FROM F4105
Beachten Sie, dass diese Frage für DB2 auf IBM i ist, wie durch das IBM-Midrange-Tag angezeigt wird. – WarrenT