Kategorien:

Konvertierungsfunktionen

TRY_TO_DECIMAL, TRY_TO_NUMBER, TRY_TO_NUMERIC

Eine spezielle Version von TO_DECIMAL , TO_NUMBER , TO_NUMERIC, die dieselbe Operation der Konvertierung eines Eingabeausdrucks in eine Festkommazahl ausführt, aber über eine Unterstützung bei der Fehlerbehandlung verfügt, sodass die Funktion NULL zurückgibt, wenn die Konvertierung nicht durchgeführt werden kann.

Diese Funktionen haben die gleiche Bedeutung.

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> ] ] )
Copy

Argumente

Benötigt:

string_expr

Ein Ausdruck vom Typ VARCHAR.

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 einen Wert vom Typ NUMBER mit den folgenden Standardwerten zurück:

  • Wenn die precision nicht angegeben ist, wird sie standardmäßig auf 38 eingestellt.

  • Wenn die scale nicht angegeben ist, wird sie standardmäßig auf 0 eingestellt.

Wenn die Konvertierung nicht durchgeführt werden kann oder die Eingabe NULL ist, wird NULL zurückgegeben.

Nutzungshinweise

Die Eingabe muss ein Zeichenfolgenausdruck sein.

Beispiele

Das folgende 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');
Copy
100039 (22003): Numeric value '345.123' is out of range

Die folgende 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');
Copy
+-------------+-----+----------------+--------------------+
| ORIG_STRING | DEC | DEC_WITH_SCALE | DEC_WITH_RANGE_ERR |
|-------------+-----+----------------+--------------------|
| 345.123     | 345 |         345.12 |               NULL |
+-------------+-----+----------------+--------------------+

Das folgende Beispiel schlägt fehl, weil die Eingabezeichenfolge nicht nur Ziffern und Dezimalpunkte enthält, sondern auch ein Dollarzeichen ($) und ein Komma zum Trennen der Zifferngruppen. Der Format-Spezifizierer für die letzte Spalte teilt der Funktion TO_DECIMAL jedoch nicht mit, dass sie das Dollarzeichen und das Komma erwarten soll:

SELECT column1 AS orig_string,
       TO_DECIMAL(column1, '$9,999.00') AS num,
       TO_DECIMAL(column1, '$9,999.00', 6, 2) AS num_with_scale,
       TO_DECIMAL(column1, 6, 2) AS num_with_format_err
  FROM VALUES ('$7,543.21');
Copy
100038 (22018): Numeric value '$7,543.21' is not recognized

Die folgende 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, '$9,999.00') AS num,
       TRY_TO_DECIMAL(column1, '$9,999.00', 6, 2) AS num_with_scale,
       TRY_TO_DECIMAL(column1, 6, 2) AS num_with_format_err
  FROM VALUES ('$7,543.21');
Copy
+-------------+------+----------------+---------------------+
| ORIG_STRING |  NUM | NUM_WITH_SCALE | NUM_WITH_FORMAT_ERR |
|-------------+------+----------------+---------------------|
| $7,543.21   | 7543 |        7543.21 |                NULL |
+-------------+------+----------------+---------------------+

Das folgende Beispiel schlägt fehl, weil der Eingabeausdruck Zeichen enthält, die keine Ziffern sind:

SELECT column1 AS orig_string,
       TO_DECIMAL(column1) AS num
  FROM VALUES ('aaa');
Copy
100038 (22018): Numeric value 'aaa' is not recognized

Die folgende 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) AS num
  FROM VALUES ('aaa');
Copy
+-------------+------+
| ORIG_STRING | NUM  |
|-------------+------|
| aaa         | NULL |
+-------------+------+

Sie können die Konvertierung durchführen, wenn Sie das Formatelement X mit der TO_DECIMAL- oder TRY_TO_DECIMAL-Funktion angeben, um einen hexadezimalen Wert in einen dezimalen Wert zu konvertieren.

SELECT column1 AS orig_string,
       TO_DECIMAL(column1, 'XXX') AS to_decimal_num,
       TRY_TO_DECIMAL(column1, 'XXX') AS try_to_decimal_num
  FROM VALUES ('aaa');
Copy
+-------------+----------------+--------------------+
| ORIG_STRING | TO_DECIMAL_NUM | TRY_TO_DECIMAL_NUM |
|-------------+----------------+--------------------|
| aaa         |           2730 |               2730 |
+-------------+----------------+--------------------+

Weitere Beispiele finden Sie unter TO_DECIMAL , TO_NUMBER , TO_NUMERIC.