2016-09-26 6 views
-1

Ich habe eine Anforderung in Oracle.Orakeldaten mit zwei Nullen nach Dezimal konvertieren

Sample Data 
----------- 
345 
34 
23423 

Ich möchte die Ausgabe kann dies

Expected output 
--------------- 
345.00 
34.00 
23423.00 

Die Abfrage entweder allgemein oder auf Oracle spezifisch mögen.

Die to_char -Funktion in Oracle kann verwendet werden, aber die Länge der Daten ist mehr als 25, so dass die To_char dort fehlschlagen wird.

+0

Ich versuchte mit to_char (345,999,99), Cast usw. .. Aber das Problem ist die Länge der Daten variiert. –

+0

Warum verwenden Sie die DecimalFormat-Klasse nicht in Ihrem Java-Code? – Jens

+0

Das ist das Problem, ich squoopy die Daten und dumping in HDFS. Also die einzige verfügbare Option ist mit SQL-Abfrage zu tun. Ich möchte kein zusätzliches MapReduce darüber laufen lassen, um die Daten zu konvertieren. –

Antwort

1

schmutzig sein, aber dennoch funktioniert es für Sie.

to_char(number_value,'FM'||LPAD(9,38,9)||'.90') 

Verwenden des MAX 38-stelligen Werts als Formatmodell.

with my_data(number_value) as 
    (
    select 999999999999 from dual 
    union 
    select 9 from dual 
    union 
    select .009 from dual 
    union 
    select .9 from dual 
    union 
    select 999 from dual 
) 
    select to_char(number_value,'FM'||LPAD(9,38,9)||'.90') from my_data; 
+0

hinzugefügt Großer Mann .. Ich suchte nach einer Lösung wie dieser. Vielen Dank .... –

+0

to_char (number_value, 'FM' || LPAD (9,38,9) || '.90') hat super für mich gearbeitet. Kann bitte erklären, was das bedeutet "FM" || LPAD (9,38,9) || '.90' – user3686535

+0

Zum Beispiel "LPAD (A, 5, A) = AAAAA" (5 mal) .. Bin gerade dabei, die Länge Format Modell (99999999 .. blahblah), mit diesem. –

0

verwenden:

SELECT 
    CAST(YOUR_COL as decimal(38,2)) as OUTPUT 
FOM xyz 

oder google!

+0

Ich versuchte ** SELECT CAST (456 als Dezimal (38,2)) wie OUTPUT FROM DUAL ; ** Das Ergebnis ist 456. Was ich will, ist 456,00. –

+0

Interessant, es war korrekt auf meinem ORA-System. Dies muss dann eine db-Konfiguration sein. Danke für die Rückmeldung. – hogan

1

Versuchen Sie, mit so etwas wie

(HINWEIS: Passen Anzahl der "9" korrekte Ausgabe mit der längsten Nummer haben Sie haben können)

select a, to_char(a, '999999999990.00') from T; 

|  A | TO_CHAR(A,'999999999990.00') | 
|--------|------------------------------| 
| 0.1 |       0.10 | 
| 0.02 |       0.02 | 
|  2 |       2.00 | 
| 2.2 |       2.20 | 
| 2.22 |       2.22 | 
| 10.22 |      10.22 | 
| 101.22 |      101.22 | 

SQL Fiddle http://sqlfiddle.com/#!4/6a168/6

EDIT: Das Deshalb habe ich NOTE am Anfang gesetzt, abhängig von Ihrer Nummer. Für Ihren Fall können Sie

select to_char(1234567891011121314, '9999999999999999990.00') from dual; 

Für numerische (32,2) setzen das sein kann:

create table T (a numeric(32,2)); 
insert into T values(123456789.12); 

| TO_CHAR(A,'999999999999999999999999999990.00') | 
|------------------------------------------------| 
|    123456789.12 | 
+0

** Wählen Sie to_char (1234567891011121314, '999999999990.00') von Dual; ** Können Sie es jetzt versuchen? Ich kann die Länge des Wertes nicht vorhersagen. Die im Schema angegebene Größe ist Nummer (32,2), was bedeutet, dass ein Wert mit der Größe 32 gespeichert werden kann. –

+0

Wählen Sie to_char (98754666666666666231654654654564564545645645645646456665456456456456456445, '999999999999999999999999999999999999999999999999999999999.99') als Betrag von Dual; Dies wird in diesem Fall nicht funktionieren. –

+0

Dies überschreitet bereits die numerische Genauigkeitsgrenze von Oracle. Sie können Ihre Daten nicht in der Tabelle mit dem von Ihnen angegebenen Wert speichern. Und diese Lösung ist im Grunde genommen die gleiche wie die später angenommene Lösung. Der einzige Unterschied ist einfach, dass die Antwort 'lpad' verwendet, um diese lange Zeile von' 9's zu erstellen. –