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');
Copy

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;
Copy

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 Funktion my_float_function() übergeben werden kann, die einen FLOAT-Wert erwartet:

      SELECT my_float_function(my_integer_column)
          FROM my_table;
      
      Copy
  • 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';
      
      Copy

      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 Wert my_float_column verglichen werden kann:

      SELECT ...
          FROM my_table
          WHERE my_integer_column < my_float_column;
      
      Copy

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;
Copy

Der Umwandlungsoperator hat einen höheren Rang als der arithmetische Operator * (Multiplikation), sodass die Anweisung wie folgt interpretiert wird:

... height * (width::VARCHAR) ...
Copy

Um das Ergebnis des Ausdrucks height * width umzuwandeln, verwenden Sie Klammern, wie unten gezeigt:

SELECT (height * width)::VARCHAR || " square meters"
    FROM dimensions;
Copy

Betrachten Sie als weiteres Beispiel die folgende Anweisung:

SELECT -0.0::FLOAT::BOOLEAN;
Copy

Hier könnte folgende Interpretation erwartet werden:

SELECT (-0.0::FLOAT)::BOOLEAN;
Copy

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

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

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

BINARY

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

BOOLEAN

NUMBER

TO_NUMBER

VARCHAR

TO_VARCHAR

Zum Beispiel von TRUE in „true“.

VARIANT

TO_VARIANT

DATE

TIMESTAMP

TO_TIMESTAMP

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

FLOAT . (Gleitkommazahlen)

BOOLEAN

TO_BOOLEAN

Zum Beispiel von 0,0 in FALSE.

NUMBER[(p,s)]

TO_NUMBER

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

GEOGRAPHY

VARIANT

TO_VARIANT

GEOMETRY

VARIANT

TO_VARIANT

NUMBER[(p,s)] . (Festkommazahlen, einschließlich INTEGER)

BOOLEAN

TO_BOOLEAN

Zum Beispiel von 0 in FALSE.

FLOAT

TO_DOUBLE

TIMESTAMP

TO_TIMESTAMP

[1]

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

OBJECT

ARRAY

TO_ARRAY

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

TIME

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

TIMESTAMP

DATE

TO_DATE , DATE

TIME

TO_TIME , TIME

VARCHAR

TO_VARCHAR

VARIANT

TO_VARIANT

VARCHAR

BOOLEAN

TO_BOOLEAN

Zum Beispiel von „false“ in FALSE.

DATE

TO_DATE , DATE

FLOAT

TO_DOUBLE

Zum Beispiel von „12:34“ in 12:34.

NUMBER[(p,s)]

TO_NUMBER

Zum Beispiel von „12:34“ in 12:34.

TIME

TO_TIME , TIME

TIMESTAMP

TO_TIMESTAMP

VARIANT

TO_VARIANT

VARIANT

ARRAY

TO_ARRAY

BOOLEAN

TO_BOOLEAN

Zum Beispiel von einem VARIANT-Wert, der „false“ enthält, in FALSE.

DATE

TO_DATE , DATE

FLOAT

TO_DOUBLE

GEOGRAPHY

TO_GEOGRAPHY

NUMBER[(p,s)]

TO_NUMBER

OBJECT

TO_OBJECT

TIME

TO_TIME , TIME

TIMESTAMP

TO_TIMESTAMP

VARCHAR

TO_VARCHAR

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

    In diesem Beispiel hat die Zahl 12.3 zwei Ziffern vor dem Dezimalpunkt, aber der Datentyp NUMBER(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}');
    
    Copy

    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                               |
    +----------+-----------------+---------------------------------+
    
    Copy
  • 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]               |
    +--------------------------------+--------------------------------+
    
    Copy

    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.