View Full Version : QRY negative Zahl mit digits umwandeln und - nicht verlieren
hi *all,
möchte im QRY ein neg. num feld (z.b. -1000) in ein char umwandeln, dabei verliert er aber das "-".
mfg
Ludwig
RobertMack
14-04-05, 13:24
das ist eher ein Fall für SQL oder QQMQRY:
select char(zoned(feldx, 11, 2)) from ...
Gruß,
Robert
Kleiner Nachteil der Funktion "char": sie liefert die Zahl linksbündig unformatiert.
Hallo,
die char-Funktion hat Nachteile, die beim CAST nicht auftreten.
Beispiel:
Feld number ist ein numerisches Feld mit negativen Werten.
SELECT CAST(number AS CHAR(10))
FROM lib/table
So long,
Uwe
Da war ich wohl etwas zu voreilig.
Beim CAST stehen die Werte natürlich linksbündig, was nicht unbedingt schön aussieht.
Hier kommt jetzt aber die Lösung, wie das ganze rechtsbündig zu stellen ist.
Annahme:
Feld number ist decimal(12, 2) definiert.
Für die Zeichendarstellung brauchen wir inklusive Vorzeichen 13 Stellen.
Der "Trick" ist, dass man die Länge des Wertes feststellt und dann die danach folgenden Leerzeichen im Ergebnis zuerst ausgibt und dann erst die eigentlich Zahl:
SELECT
SUBSTR(cast(number as character(13)),
length(trim(cast(number as character(13))))+1,
13-length(trim(cast(number as character(13))))
concat
LEFT(cast(number as character(13)),
length(trim(cast(number as character(13))))),
cast(number as character(13))
FROM lib/table
Schönen Abend noch
Uwe
Dann würde ich doch den etwas einfacheren Weg gehen:
select concat(digits(mynum),
case when mynum<0 then '-' else '+' end)
from myfile
Hallo Fuerchau,
bei Deiner Lösung stehen führende Nullen und vor allem fehlt das Dezimalzeichen (Komma).
Hier ein verbessertes Beispiel von mir.
Das Feld mynum ist als decimal(12, 2) definiert!
Es werden somit 14 Stellen benötigt.
Bei Verwendung von Digits sieht es so aus:
mynum wird_zu
1,23 000000000123+
1324567890,12- 132456789012-
2333312- 000002333312-
So steht alles korrekt rechtsbündig, das Komma ist dabei und auch das Vorzeichen:
SELECT mynum,
SPACE(
14-LENGTH(TRIM(CAST(mynum AS CHAR(14)))))
CONCAT
LEFT(CAST(mynum AS CHAR(14)),
LENGTH(TRIM(CAST(mynum AS CHAR(14)))))
FROM myfile
Das ist zwar etwas kompliziert, aber es bringt ein schönes Ergebnis.
Uwe
Wie immer gibts da viele Lösungen.
Am besten wäre denn doch eine kleine (externe) SQL-Funktion, z.B. in RPGLE die das Ganze einfach als %editc intern auflöst.
Mittels Überladungen (verschiedene Eingabeparameter) kann man mehrere Varianten erstellen und man braucht sich um diese ganzen Längen und Concat's nicht zu kümmern.