2016-07-22 7 views
0

Original-Abfrage:Wie SUBSTR eine berechnete Zeile in SQL Query?

SELECT F4105.COUNCS/10000 FROM F4105 

Ausgang:

Numeric Expression 
    -------------------- 
    111.1643000000000000 
    111.1633000000000000 
    111.1633000000000000 
    101.7654000000000000 
    101.7654000000000000 
    112.7258000000000000 

Ich brauche mindestens die letzten fünf Nullen zu entfernen. Ich habe versucht, einen Teilstring zu machen, aber es hat nicht funktioniert.

Hier ist die Abfrage (n) Ich habe versucht:

(1) 
    SELECT SUBSTR((F4105.COUNCS/10000 AS 'co'),length((co)-5) FROM F4105 
(2) 
    SELECT SUBSTR((F4105.COUNCS/10000),length((F4105.COUNCS/10000)-5)) FROM F4105               

Die erste Abfrage gab mir und Fehler:

Token F4105 was not valid. Valid tokens: (.

Die zweite Abfrage durch falsche Ausgabe gearbeitet.

SUBSTR  
00   
000000  
000000  
000000  
000000  
000000 
+0

Beachten Sie, dass diese Frage für DB2 auf IBM i ist, wie durch das IBM-Midrange-Tag angezeigt wird. – WarrenT

Antwort

4

Sie mischen die Spaltenaliasdefinition im Ausdruck. Also, der korrekte Ausdruck ist mehr wie:

SELECT SUBSTR(F4105.COUNCS/10000, length(F4105.COUNCS/10000.0) - 5) as coFROM F4105 

Ich würde nicht empfehlen, dies zu tun, jedoch. Sie haben einen numerischen Ausdruck. konvertieren Sie es einfach in eine Dezimaldarstellung, die Sie wollen, sagen:

SELECT CAST(F4105.COUNCS/10000.0 as DECIMAL(10, 5)) 
+0

Danke, der zweite hat funktioniert. Die erste gibt jedoch nur Nullen aus. – Shank

+0

Re "Erstes gibt nur Nullen aus": Siehe die _answer_ ich gerade geliefert, wobei ich erkläre, warum die erste der oben genannten, unter der Annahme, dass 'wie coFROM' 'co FROM' umgeschrieben wird, nähert sich das Erreichen des gewünschten Ergebnisses nach Ersetzen Sie entweder die Verwendung von SUBSTR durch Verwendung von LEFT, oder fügen Sie ein Literal "1" als zweites Argument von SUBSTR ein, wodurch die Länge (...) zum dritten Argument wird. – CRPence

1

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