Kategorien:

Konvertierungsfunktionen

TRY_TO_DECIMAL, TRY_TO_NUMBER, TRY_TO_NUMERIC

Eine spezielle Version von TO_DECIMAL , TO_NUMBER , TO_NUMERIC, die dieselbe Operation ausführt (d. h. einen Eingabeausdruck in eine Festkommazahl konvertiert), jedoch mit Unterstützung für die Fehlerbehandlung (d. h. wenn die Konvertierung nicht ausgeführt werden kann, wird ein NULL-Wert zurückgegeben, anstatt einen Fehler zu erzeugen).

Diese Funktionen sind gleichbedeutend.

Weitere Informationen dazu finden Sie unter Konvertierungsfunktionen zur Fehlerbehandlung.

Syntax

TRY_TO_DECIMAL( <string_expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

TRY_TO_NUMBER( <string_expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

TRY_TO_NUMERIC( <string_expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

Argumente

Benötigt:

Zeichenfolgenausdruck

Ein Ausdruck vom Typ VARCHAR.

Optional:

Format

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

Genauigkeit

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).

Skalierung

Die Anzahl der Nachkommastellen (von 0 bis Genauigkeit - 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(p,s) zurück, wobei p die Genauigkeit und s die Skalierung ist.

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

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

Nutzungshinweise

  • Funktioniert nur bei Zeichenfolgenausdrücken.

Beispiele

Die folgenden Beispiele veranschaulichen die Verwendung von TRY_TO_DECIMAL:

Das erste Beispiel schlägt fehl, weil in der letzten Spalte („dec_with_range_error“) nicht genügend signifikante Ziffern gespeichert sind, um den Wert aufzunehmen, den sie enthalten sollen.

SELECT column1 AS orig_string,
       TO_DECIMAL(column1) AS dec,
       TO_DECIMAL(column1, 10, 2) AS dec_with_scale,
       TO_DECIMAL(column1, 4, 2) AS dec_with_range_err
  FROM VALUES ('345.123');
100039 (22003): Numeric value '345.123' is out of range

Die nächste Abfrage ist mit der vorherigen identisch, außer dass TRY_TO_DECIMAL anstelle von TO_DECIMAL verwendet wird, sodass der Wert außerhalb des Bereichs in NULL konvertiert wird.

SELECT column1 AS orig_string,
       TRY_TO_DECIMAL(column1) AS dec,
       TRY_TO_DECIMAL(column1, 10, 2) AS dec_with_scale,
       TRY_TO_DECIMAL(column1, 4, 2) AS dec_with_range_err
  FROM VALUES ('345.123');
+-------------+-----+----------------+--------------------+
| ORIG_STRING | DEC | DEC_WITH_SCALE | DEC_WITH_RANGE_ERR |
|-------------+-----+----------------+--------------------|
| 345.123     | 345 |         345.12 |               NULL |
+-------------+-----+----------------+--------------------+

Dieses Beispiel schlägt fehl, weil die Eingabezeichenfolge nicht nur Ziffern und Dezimalpunkte, sondern auch ein Dollarzeichen enthält. Der Formatbezeichner für die letzte Spalte teilt der Funktion TO_DECIMAL jedoch nicht mit, dass ein Dollarzeichen erwartet wird.

SELECT column1 AS orig_string,
       TO_DECIMAL(column1, '$999.00') AS num,
       TO_DECIMAL(column1, '$999.00', 5, 2) AS num_with_scale,
       TO_DECIMAL(column1, 5, 2) AS num_with_format_err
  FROM VALUES ('$345.12');
100038 (22018): Numeric value '$345.12' is not recognized

Die nächste Abfrage ist mit der vorherigen identisch, außer dass sie TRY_TO_DECIMAL anstelle von TO_DECIMAL verwendet und die Eingabe in NULL konvertiert.

SELECT column1 AS orig_string,
       TRY_TO_DECIMAL(column1, '$999.00') AS num,
       TRY_TO_DECIMAL(column1, '$999.00', 5, 2) AS num_with_scale,
       TRY_TO_DECIMAL(column1, 5, 2) AS num_with_format_err
  FROM VALUES ('$345.12');
+-------------+-----+----------------+---------------------+
| ORIG_STRING | NUM | NUM_WITH_SCALE | NUM_WITH_FORMAT_ERR |
|-------------+-----+----------------+---------------------|
| $345.12     | 345 |         345.12 |                NULL |
+-------------+-----+----------------+---------------------+