Datentypkonvertierung¶
In vielen Fällen kann ein Wert von einem Datentyp in einen anderen Datentyp konvertiert werden. Beispielsweise kann ein Wert vom Typ INTEGER in einen Gleitkomma-Datentyp konvertiert werden. Das Konvertieren eines Datentyps wird Umwandlung genannt.
Unter diesem Thema:
Explizite Umwandlung vs. implizite Umwandlung¶
Benutzer können einen Wert explizit von einem Datentyp in einen anderen umwandeln. Dies wird explizite Umwandlung genannt.
In manchen Situationen konvertiert Snowflake einen Wert automatisch in einen anderen Datentyp. Dies wird implizite Umwandlung oder Koersion genannt.
Explizite Umwandlung¶
Benutzer können einen Wert explizit mit einer der folgenden Optionen umwandeln:
Funktion CAST
Operator
::
(auch Umwandlungsoperator genannt)Die entsprechende SQL-Funktion (z. B. TO_DOUBLE)
Beispiel:
SELECT CAST('2022-04-01' AS DATE); SELECT '2022-04-01'::DATE; SELECT TO_DATE('2022-04-01');
Eine Umwandlung ist in den meisten Kontexten erlaubt, in denen ein allgemeiner Ausdruck erlaubt ist, einschließlich der WHERE-Klausel. Beispiel:
SELECT date_column FROM log_table WHERE date_column >= '2022-04-01'::DATE;
Implizite Umwandlung („Koersion“)¶
Koersion tritt auf, wenn eine Funktion (oder ein Operator) einen Datentyp benötigt, der sich von den Argumenten (oder Operanden) unterscheidet, aber mit ihnen kompatibel ist.
Beispiele für Funktionen oder gespeicherte Prozeduren:
Der folgende Code wandelt den INTEGER-Wert in der Spalte
my_integer_column
in einen FLOAT-Wert um, sodass der Wert an die Funktionmy_float_function()
übergeben werden kann, die einen FLOAT-Wert erwartet:SELECT my_float_function(my_integer_column) FROM my_table;
Beispiele für Operatoren:
Der folgende Code wandelt den INTEGER-Wert
17
in einen VARCHAR-Wert um, sodass die Werte mithilfe des||
-Operators verkettet werden können:SELECT 17 || '76';
Das Ergebnis dieser SELECT-Anweisung ist die Zeichenfolge
'1776'
.Die folgende Anweisung wandelt den INTEGER-Wert in der Spalte
my_integer_column
in einen FLOAT-Wert um, sodass der Wert mithilfe des Vergleichsoperators<
mit dem Wertmy_float_column
verglichen werden kann:SELECT ... FROM my_table WHERE my_integer_column < my_float_column;
Nicht alle Kontexte (z. B. nicht alle Operatoren) unterstützen Koersion.
Umwandlung und Rangfolge¶
Beim Umwandeln innerhalb eines Ausdrucks muss der Code den Vorrang des Umwandlungsoperators vor anderen Operatoren im Ausdruck berücksichtigen.
Betrachten Sie das folgende Beispiel:
SELECT height * width::VARCHAR || " square meters" FROM dimensions;
Der Umwandlungsoperator hat einen höheren Rang als der arithmetische Operator *
(Multiplikation), sodass die Anweisung wie folgt interpretiert wird:
... height * (width::VARCHAR) ...
Um das Ergebnis des Ausdrucks height * width
umzuwandeln, verwenden Sie Klammern, wie unten gezeigt:
SELECT (height * width)::VARCHAR || " square meters" FROM dimensions;
Betrachten Sie als weiteres Beispiel die folgende Anweisung:
SELECT -0.0::FLOAT::BOOLEAN;
Hier könnte folgende Interpretation erwartet werden:
SELECT (-0.0::FLOAT)::BOOLEAN;
sodass FALSE zurückgegeben wird (0 = FALSE, 1 = TRUE).
Der Umwandlungsoperator hat jedoch einen höheren Rang als der unäre Minus-Operator (Negation), sodass die Anweisung wie folgt interpretiert wird:
SELECT -(0.0::FLOAT::BOOLEAN);
Dies führt zu einer Fehlermeldung, weil das unäre Minus nicht auf BOOLEAN angewendet werden kann.
Datentypen, die umgewandelt werden können¶
Die folgende Tabelle zeigt die gültigen Datentypkonvertierungen in Snowflake. Die Tabelle zeigt auch, welche Koersionen Snowflake automatisch ausführen kann.
Bemerkung
Intern rufen die Funktion CAST und der Operator ::
die entsprechende Umwandlungsfunktion auf. Wenn Sie zum Beispiel einen NUMBER-Wert in einen BOOLEAN-Wert umwandeln, ruft Snowflake die Funktion TO_BOOLEAN auf. Die Nutzungshinweise für jede Konvertierungsfunktion gelten sowohl für den indirekten Aufruf der Funktion über eine Umwandlung als auch für den direkten Aufruf der Funktion. Wenn Sie beispielsweise CAST(my_decimal_column as BOOLEAN)
ausführen, gelten die Regeln für den Aufruf von TO_BOOLEAN
mit einem DECIMAL-Wert. Der Einfachheit halber enthält die Spalte „Anmerkungen“ in der nachstehenden Tabelle Links zu den entsprechenden Umrechnungsfunktionen.
Weitere Informationen zum Konvertieren zwischen semistrukturierten Typen und strukturierten Typen finden Sie unter Konvertieren strukturierter und semistrukturierter Typen.
Quell-Datentyp |
Ziel-Datentyp |
Umwandlung |
Koersion |
Konvertierungsfunktion |
Anmerkungen |
---|---|---|---|---|---|
ARRAY |
|||||
✔ |
❌ |
||||
✔ |
✔ |
||||
BINARY |
|||||
✔ |
❌ |
||||
✔ |
❌ |
||||
BOOLEAN |
|||||
✔ |
❌ |
||||
✔ |
✔ |
Zum Beispiel von TRUE in „true“. |
|||
✔ |
✔ |
||||
DATE |
|||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
FLOAT . (Gleitkommazahlen) |
|||||
✔ |
✔ |
Zum Beispiel von 0,0 in FALSE. |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
GEOGRAPHY |
|||||
✔ |
❌ |
||||
GEOMETRY |
|||||
✔ |
❌ |
||||
NUMBER[(p,s)] . (Festkommazahlen, einschließlich INTEGER) |
|||||
✔ |
✔ |
Zum Beispiel von 0 in FALSE. |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
OBJECT |
|||||
✔ |
❌ |
||||
✔ |
❌ |
||||
✔ |
✔ |
||||
TIME |
|||||
✔ |
✔ |
||||
✔ |
❌ |
||||
TIMESTAMP |
|||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
VARCHAR |
|||||
✔ |
✔ |
Zum Beispiel von „false“ in FALSE. |
|||
✔ |
✔ |
||||
✔ |
✔ |
Zum Beispiel von „12:34“ in 12:34. |
|||
✔ |
✔ |
Zum Beispiel von „12:34“ in 12:34. |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
VARIANT |
|||||
✔ |
✔ |
||||
✔ |
✔ |
Zum Beispiel von einem VARIANT-Wert, der „false“ enthält, in FALSE. |
|||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
❌ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
||||
✔ |
✔ |
Anmerkungen
Für jeden aufgeführten Datentyp (z. B. FLOAT) gelten die Regeln für alle Aliasse dieses Datentyps (z. B. gelten die Regeln für FLOAT auch für DOUBLE, das ein Alias für FLOAT ist).
Nutzungshinweise¶
Wenn nicht anders angegeben, gelten die folgenden Regeln sowohl für das explizite als auch für das implizite Umwandeln.
Die Konvertierung hängt nicht nur vom Datentyp der Quelle, sondern auch vom Wert der Quelle ab. Beispiel:
Der VARCHAR-Wert „123“ kann in einen numerischen Wert umgewandelt werden, aber der VARCHAR-Wert „xyz“ kann nicht in einen numerischen Wert umgewandelt werden.
Die Fähigkeit, einen bestimmten Wert des Typs VARIANT umzuwandeln, hängt vom Typ der Daten innerhalb des VARIANT-Werts ab. Wenn zum Beispiel VARIANT einen Wert des Typs TIME enthält, kann VARIANT nicht in TIMESTAMP umgewandelt werden, weil sich TIME nicht in TIMESTAMP umwandeln lässt.
Übergeben Sie möglichst Argumente desselben Typs. Vermeiden Sie die Übergabe von Argumenten unterschiedlichen Typs.
Wenn eines der Argumente eine Zahl ist, führt die Funktion automatisch eine Umwandlung der nichtnumerischen Zeichenfolgenargumente (z. B.
'a string'
) und der Zeichenfolgenargumente, die keine Konstanten sind, in den Typ NUMBER(18,5) aus.Wenn bei numerischen Zeichenfolgenargumenten, die keine Konstanten sind, NUMBER(18,5) nicht ausreicht, um den numerischen Wert darzustellen, müssen Sie das Argument in einen Typ umwandeln, der den Wert darstellen kann.
Bei einigen Paaren von Datentypen kann die Konvertierung zu einem Verlust an Genauigkeit führen. Beispiel:
Bei der Umwandlung von FLOAT in INTEGER wird der Wert gerundet.
Die Umwandlung eines Wertes von einer Festkommazahl (z. B. NUMBER(38, 0)) in eine Fließkommazahl (z. B. FLOAT) kann zu Rundungen oder Abschneidungen führen, wenn die Festkommazahl nicht genau in einer Gleitkommazahl dargestellt werden kann.
Bei der Umwandlung eines TIMESTAMP-Werts in einen DATE-Wert wird die Information über die Tageszeit entfernt.
Obwohl Snowflake in einigen Situationen, in denen ein Genauigkeitsverlust auftreten kann, Werte konvertiert, erlaubt Snowflake keine Konvertierung in anderen Situationen, in denen ein Genauigkeitsverlust auftreten würde. So lässt Snowflake beispielsweise keine Konvertierung in folgenden Fällen zu:
Konvertierung schneidet einen Teil vom VARCHAR-Wert ab. Snowflake wandelt zum Beispiel VARCHAR(10) nicht in VARCHAR(5) um, weder implizit noch explizit.
Dies führt zum Verlust von Ziffern mit Ausnahme der niederwertigsten Ziffern. Daher führt Folgendes zu einem Fehler:
select 12.3::FLOAT::NUMBER(3,2);
In diesem Beispiel hat die Zahl
12.3
zwei Ziffern vor dem Dezimalpunkt, aber der DatentypNUMBER(3,2)
hat nur Platz für eine Ziffer vor dem Dezimalpunkt.Bei der Konvertierung von einem Typ mit geringerer Genauigkeit in einen Typ mit höherer Genauigkeit werden bei der Konvertierung Standardwerte verwendet. Wird beispielsweise ein DATE-Wert in einen TIMESTAMP_NTZ-Wert umgewandelt, werden Stunde, Minute, Sekunde und Sekundenbruchteile auf 0 gesetzt.
Wenn ein FLOAT-Wert in einen VARCHAR-Wert umgewandelt wird, werden die nachstehenden Nullen weggelassen.
Die folgenden Anweisungen dienen beispielsweise dazu, eine Tabelle zu erstellen und eine Zeile einzufügen, die einen VARCHAR-, einen FLOAT- und einen VARIANT-Wert enthält. Der VARIANT-Wert wird von JSON erstellt und enthält einen Gleitkommawert mit nachstehenden Nullen.
create or replace table tmp ( varchar1 varchar, float1 float, variant1 variant ); insert into tmp select '5.000', 5.000, parse_json('{"Loan Number": 5.000}');
Mit der folgenden SELECT-Anweisung werden sowohl die Werte der FLOAT-Spalte als auch FLOAT-Werte innerhalb der VARIANT-Spalte explizit in VARCHAR-Werte umgewandelt. In keinem der Fälle enthält der VARCHAR-Wert nachstehende Nullen:
select varchar1, float1::varchar, variant1:"Loan Number"::varchar from tmp; +----------+-----------------+---------------------------------+ | VARCHAR1 | FLOAT1::VARCHAR | VARIANT1:"LOAN NUMBER"::VARCHAR | |----------+-----------------+---------------------------------| | 5.000 | 5 | 5 | +----------+-----------------+---------------------------------+
Einige Operationen können in Abhängigkeit von einem bedingten Ausdruck unterschiedliche Datentypen zurückgeben. Beispielsweise geben die folgenden COALESCE-Aufrufe je nach Eingabewert leicht unterschiedliche Datentypen zurück:
select system$typeof(ifnull(12.3, 0)), system$typeof(ifnull(NULL, 0)); +--------------------------------+--------------------------------+ | SYSTEM$TYPEOF(IFNULL(12.3, 0)) | SYSTEM$TYPEOF(IFNULL(NULL, 0)) | +--------------------------------+--------------------------------+ | NUMBER(3,1)[SB1] | NUMBER(1,0)[SB1] | +--------------------------------+--------------------------------+
Wenn der Ausdruck mehr als einen möglichen Datentyp hat, wählt Snowflake den Datentyp auf der Grundlage des tatsächlichen Ergebnisses aus. (Weitere Informationen zu Genauigkeit und Skalierung von Berechnungen finden Sie unter Maßstab und Genauigkeit von arithmetischen Operationen). Wenn die Abfrage mehr als ein Ergebnis generiert (z. B. mehrere Ergebniszeilen), wählt Snowflake einen Datentyp aus, der jedes einzelne Ergebnis aufnehmen kann.
Einige Anwendungsprogramme, wie z. B. SnowSQL, und einige grafische Benutzeroberflächen, wie z. B. die klassische Weboberfläche, wenden bei der Anzeige von Daten ihre eigenen Konvertierungs- und Formatierungsregeln an. Beispielsweise zeigt SnowSQL die BINARY-Werte als eine Zeichenfolge an, die nur hexadezimale Ziffern enthält. Diese Zeichenfolge wird durch den impliziten Aufruf einer Konvertierungsfunktion generiert. Daher geben die von SnowSQL angezeigten Daten möglicherweise nicht eindeutig an, welche Datenumwandlungen Snowflake erzwungen hat.