Kategorien:

Konvertierungsfunktionen

TO_DECIMAL , TO_NUMBER , TO_NUMERIC

Konvertiert einen Eingabeausdruck in eine Festkommazahl. Bei Eingabe von NULL lautet die Ausgabe NULL.

Diese Funktionen sind gleichbedeutend.

Siehe auch:

TRY_TO_DECIMAL, TRY_TO_NUMBER, TRY_TO_NUMERIC

Syntax

TO_DECIMAL( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

TO_NUMBER( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

TO_NUMERIC( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
Copy

Argumente

Benötigt:

expr

Ein Ausdruck eines numerischen, Zeichen- oder Variantentyps.

Optional:

format

Das SQL-Formatmodell, mit dem die Eingabe expr analysiert und zurückgegeben wird. Weitere Informationen dazu finden Sie unter SQL-Formatmodelle.

precision

Die maximale Anzahl von Dezimalstellen in der resultierenden Zahl; von 1 bis 38. In Snowflake dient die Genauigkeit nicht zur Bestimmung der Zahl der zum Speichern erforderlichen Bytes und hat keinen Einfluss auf die Effizienz. Der Standardwert ist also das Maximum (38).

scale

Die Anzahl der Nachkommastellen (von 0 bis precision - 1). 0 steht für Zahlen ohne Nachkommastellen (d. h. ganze Zahlen). Der Standardwert für die Skalierung ist 0.

Rückgabewerte

Die Funktion gibt NUMBER(precision, scale) zurück.

  • Wenn precision nicht angegeben ist, wird standardmäßig 38 verwendet.

  • Wenn scale nicht angegeben ist, wird standardmäßig 0 verwendet.

Nutzungshinweise

  • Bei Eingabe von NULL ist das Ergebnis NULL.

  • Für Festkommazahlen:

    • Zahlen mit unterschiedlichen Maßstäben werden umgerechnet, indem entweder Nullen nach rechts hinzugefügt werden (wenn der Maßstab erhöht werden muss) oder die Anzahl der Nachkommastellen durch Runden verringert wird (wenn der Maßstab verringert werden muss).

    • Beachten Sie, dass die Umwandlung von Festkommazahlen in Festkommazahlen, die die Skalierung erhöhen, fehlschlagen kann.

  • Für Gleitkommazahlen:

    • Zahlen werden umgewandelt, wenn sie innerhalb des darstellbaren Bereichs liegen, der durch die Skala vorgegeben ist.

    • Die Umrechnung zwischen binären und dezimalen Bruchzahlen ist nicht präzise. Dies kann zu Präzisionsverlusten oder Fehlern außerhalb des Bereichs führen.

    • Werte von unendlichen Zahlen und NaN (Nichtzahlen) führen zu Konvertierungsfehler.

  • Zeichenfolgen werden als Dezimal-, Ganz-, Bruch- oder Gleitkommazahlen konvertiert.

    • Bei der Eingabe von Nachkommastellen ergibt sich die Genauigkeit aus der Anzahl der Nachkommastellen.

    • Bei der Eingabe von Gleitkommazahlen ist das Weglassen der Mantisse oder des Exponenten zulässig und wird als 0 interpretiert. Somit wird E als 0 geparst.

  • Bei VARIANT-Eingaben:

    • Wenn der VARIANT-Wert eine numerische Festkomma- oder Gleitkommazahl ist, wird eine entsprechende numerische Konvertierung durchgeführt.

    • Wenn der VARIANT-Wert eine Zeichenfolge ist, wird eine Zeichenfolgenkonvertierung durchgeführt.

    • Wenn der VARIANT-Wert ein boolescher Wert ist, ist das Ergebnis 0 oder 1 (für „false“ bzw. „true“).

    • Wenn der VARIANT-Wert ein JSON null-Wert ist, ist die Ausgabe NULL.

Beispiele

Erstellen Sie eine Tabelle mit einer VARCHAR-Spalte, rufen Sie dann die Zeichenfolgenwerte aus der Tabelle ab, und übergeben Sie diese Werte an die TO_NUMBER-Funktion mit unterschiedlichen Werten für precision und scale.

CREATE OR REPLACE TABLE number_conv(expr VARCHAR);
INSERT INTO number_conv VALUES ('12.3456'), ('98.76546');

SELECT expr, TO_NUMBER(expr),  TO_NUMBER(expr, 10, 1), TO_NUMBER(expr, 10, 8) FROM number_conv;
Copy

Die Abfrage gibt die folgende Ausgabe zurück:

+----------+-----------------+------------------------+------------------------+
| EXPR     | TO_NUMBER(EXPR) | TO_NUMBER(EXPR, 10, 1) | TO_NUMBER(EXPR, 10, 8) |
|----------+-----------------+------------------------+------------------------|
| 12.3456  |              12 |                   12.3 |            12.34560000 |
| 98.76546 |              99 |                   98.8 |            98.76546000 |
+----------+-----------------+------------------------+------------------------+

Erstellen Sie eine Abfrage auf derselben Tabelle mit der Funktion TO_NUMBER, um eine Zahl mit einem precision-Wert von 10 und einer Dezimalstellenzahl von 9 zurückzugeben.

SELECT expr, TO_NUMBER(expr, 10, 9) FROM number_conv;
Copy

Wenn das Argument precision auf 10 gesetzt ist, beträgt die maximale Anzahl der Dezimalstellen in den Ergebnissen 10. Da beide Werte in der Tabelle zwei Ziffern vor dem Dezimalpunkt haben und scale auf 9 gesetzt ist, gibt die Abfrage einen Fehler zurück, da die Ergebnisse 11 Ziffern zurückgeben würden.

100039 (22003): Numeric value '12.3456' is out of range

Verwenden Sie verschiedene Formatelemente mit der Funktion TO_DECIMAL in einer Abfrage:

SELECT column1,
       TO_DECIMAL(column1, '99.9') as D0,
       TO_DECIMAL(column1, '99.9', 9, 5) as D5,
       TO_DECIMAL(column1, 'TM9', 9, 5) as TD5
FROM VALUES ('1.0'), ('-12.3'), ('0.0'), ('- 0.1');
Copy

Die Abfrage gibt die folgende Ausgabe zurück:

+---------+-----+-----------+-----------+
| COLUMN1 |  D0 |        D5 |       TD5 |
|---------+-----+-----------+-----------|
| 1.0     |   1 |   1.00000 |   1.00000 |
| -12.3   | -12 | -12.30000 | -12.30000 |
| 0.0     |   0 |   0.00000 |   0.00000 |
| - 0.1   |   0 |  -0.10000 |  -0.10000 |
+---------+-----+-----------+-----------+

Die Ausgabe zeigt, dass das Text-minimale Formatelement TM9 genau die Anzahl der Ziffern des Nachkommastellenbereichs auf der Grundlage der angegebenen Dezimalstellenzahl ausgibt. Weitere Informationen dazu finden Sie unter Textminimale numerische Formate.

Verwenden Sie das Formatelement X mit der Funktion TO_DECIMAL, um einen hexadezimalen Wert in einen dezimalen Wert zu konvertieren:

SELECT TO_DECIMAL('ae5', 'XXX');
Copy

Die Abfrage gibt die folgende Ausgabe zurück:

+--------------------------+
| TO_DECIMAL('AE5', 'XXX') |
|--------------------------|
|                     2789 |
+--------------------------+

Die Anzahl der Ziffern im Formatelement muss gleich sein oder größer als die Anzahl der Ziffern im Ausdruck. Führen Sie zum Beispiel die folgende Abfrage aus:

SELECT TO_DECIMAL('ae5', 'XX');
Copy

Die Abfrage gibt einen Fehler zurück:

100140 (22007): Can't parse 'ae5' as number with format 'XX'