Datentypkonvertierung

In vielen Fällen kann ein Wert von einem Datentyp in einen anderen Datentyp konvertiert werden. Zum Beispiel kann ein INTEGER-Wert in einen Wert vom Gleitkommadatentyp konvertiert werden. Das Konvertieren eines Datentyps wird Umwandlung genannt.

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; zum Beispiel TO_DOUBLE.

Jede Abfrage wandelt zum Beispiel einen Zeichenfolgenwert in einen DATE-Wert um:

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 (zum Beispiel 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 im folgenden Beispiel interpretiert wird:

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

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

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

Betrachten Sie als weiteres Beispiel die folgende Anweisung:

SELECT -0.0::FLOAT::BOOLEAN;
Copy

Sie könnten erwarten, dass dies wie im folgenden Beispiel interpretiert wird:

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

Daher würde man erwarten, dass FALSE (0 = FALSE, 1 = TRUE) zurückgegeben wird.

Der Umwandlungsoperator hat jedoch einen höheren Rang als der unäre Minus-Operator (Negation), sodass die Anweisung wie im folgenden Beispiel interpretiert wird:

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

Daher führt die Abfrage 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 für den indirekten Aufruf der Funktion über eine Umwandlung und 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 Tabelle Links zu den entsprechenden Konvertierungsfunktionen.

Weitere Informationen zum Konvertieren zwischen semistrukturierten Typen und strukturierten Typen finden Sie unter Konvertieren strukturierter und semistrukturierter Typen.

Quelldatentyp

Zieldatentyp

Umwandlung

Koersion

Konvertierungsfunktion

Anmerkungen

ARRAY

VARCHAR

TO_VARCHAR

Keine.

VARIANT

TO_VARIANT

Keine.

VECTOR

Verwenden Sie die explizite Umwandlung für die Konvertierung. Weitere Informationen dazu finden Sie unter Vektor-Konvertierung.

BINARY

VARCHAR

TO_VARCHAR

Keine.

VARIANT

TO_VARIANT

Keine.

BOOLEAN

DECFLOAT

TO_DECFLOAT

Zum Beispiel von FALSE zu 0.

NUMBER

TO_NUMBER

Keine.

VARCHAR

TO_VARCHAR

Zum Beispiel von TRUE zu 'true'.

VARIANT

TO_VARIANT

Keine.

DATE

TIMESTAMP

TO_TIMESTAMP

Keine.

VARCHAR

TO_VARCHAR

Keine.

VARIANT

TO_VARIANT

Keine.

DECFLOAT . (Gleitkommazahlen)

BOOLEAN

TO_BOOLEAN

Zum Beispiel von 0 zu FALSE.

FLOAT

TO_DOUBLE

Keine.

NUMBER[(p,s)]

TO_NUMBER

Keine.

VARCHAR

TO_VARCHAR

Keine.

FLOAT . (Gleitkommazahlen)

BOOLEAN

TO_BOOLEAN

Zum Beispiel von 0.0 zu FALSE.

DECFLOAT

TO_DECFLOAT

Keine.

NUMBER[(p,s)]

TO_NUMBER

Keine.

VARCHAR

TO_VARCHAR

Keine.

VARIANT

TO_VARIANT

Keine.

GEOGRAPHY

VARIANT

TO_VARIANT

Keine.

GEOMETRY

VARIANT

TO_VARIANT

Keine.

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

BOOLEAN

TO_BOOLEAN

Zum Beispiel von 0 zu FALSE.

DECFLOAT

TO_DECFLOAT

Keine.

FLOAT

TO_DOUBLE

Keine.

TIMESTAMP

TO_TIMESTAMP

[1]

VARCHAR

TO_VARCHAR

Keine.

VARIANT

TO_VARIANT

Keine.

OBJECT

ARRAY

TO_ARRAY

Keine.

VARCHAR

TO_VARCHAR

Keine.

VARIANT

TO_VARIANT

Keine.

TIME

VARCHAR

TO_VARCHAR

Keine.

VARIANT

TO_VARIANT

Keine.

TIMESTAMP

DATE

TO_DATE , DATE

Keine.

TIME

TO_TIME , TIME

Keine.

VARCHAR

TO_VARCHAR

Keine.

VARIANT

TO_VARIANT

Keine.

VARCHAR

BOOLEAN

TO_BOOLEAN

Zum Beispiel von 'false' zu FALSE.

DATE

TO_DATE , DATE

Keine.

DECFLOAT

TO_DECFLOAT

Keine.

FLOAT

TO_DOUBLE

Zum Beispiel von '12.34' zu 12.34.

NUMBER[(p,s)]

TO_NUMBER

Zum Beispiel von '12.34' zu 12.34.

TIME

TO_TIME , TIME

Keine.

TIMESTAMP

TO_TIMESTAMP

Keine.

VARIANT

TO_VARIANT

Keine.

VARIANT

ARRAY

TO_ARRAY

Keine.

BOOLEAN

TO_BOOLEAN

Zum Beispiel von einem VARIANT mit 'false' zu FALSE.

DATE

TO_DATE , DATE

Keine.

FLOAT

TO_DOUBLE

Keine.

GEOGRAPHY

TO_GEOGRAPHY

Keine.

NUMBER[(p,s)]

TO_NUMBER

Keine.

OBJECT

TO_OBJECT

Keine.

TIME

TO_TIME , TIME

Keine.

TIMESTAMP

TO_TIMESTAMP

Keine.

VARCHAR

TO_VARCHAR

Keine.

VECTOR

Der VARIANT-Wert muss ein ARRAY vom Typ FLOAT oder INT enthalten.

VECTOR

ARRAY

TO_ARRAY

Keine.

Bemerkung

Für jeden aufgeführten Datentyp – zum Beispiel FLOAT – gelten die Regeln für alle Aliasse dieses Datentyps. Beispielsweise gelten die Regeln für FLOAT 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, sondern auch vom Wert der Quelle ab. Beispiel:

    • Der Wert VARCHAR '123' kann in einen numerischen Wert umgewandelt werden, aber der Wert VARCHAR '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 von VARIANT ab. Wenn VARIANT beispielsweise einen Wert des Typs TIME enthält, können Sie den Wert VARIANT-Wert nicht in einen TIMESTAMP-Wert umwandeln, denn Sie können einen TIME-Wert nicht in einen TIMESTAMP-Wert umwandeln.

  • Snowflake führt eine implizite Konvertierung von Argumenten aus, damit diese kompatibel sind. Wenn beispielsweise einer der Eingabeausdrücke ein numerischer Typ ist, ist der Rückgabetyp ebenfalls ein numerischer Typ. Das heißt, SELECT COALESCE('17', 1); konvertiert zuerst den VARCHAR-Wert '17' in den NUMBER-Wert 17 und gibt dann den ersten Nicht-NULL-Wert zurück.

    Wenn eine Konvertierung nicht möglich ist, schlägt die implizite Konvertierung fehl. Beispiel: SELECT COALESCE('foo', 1); gibt einen Fehler zurück, da der VARCHAR-Wert 'foo' nicht in einen NUMBER-Wert konvertiert werden kann.

    Wir empfehlen, Argumente desselben Typs zu übergeben oder Argumente bei Bedarf explizit zu konvertieren.

  • Wenn die implizite Konvertierung einen nichtnumerischen Wert in einen numerischen Wert konvertiert, ist das Ergebnis ein Wert vom Typ NUMBER(18,5).

    Wenn bei numerischen Zeichenfolgenargumenten, die keine Konstanten sind, NUMBER(18,5) nicht ausreicht, um den numerischen Wert darzustellen, wandeln Sie das Argument in einen-Typ um, der den Wert darstellen kann.

  • Bei einigen Paaren von Datentypen kann die Konvertierung zu einem Verlust an Genauigkeit führen. Beispiel:

    • Bei der Konvertierung eines FLOAT-Wertes in einen INTEGER-Wert wird der Wert gerundet.

    • Die Umwandlung eines Wertes von einer numerischen Festkommazahl – z. B. NUMBER(38, 0) – in eine Gleitkommazahl – 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-Wertes in einen DATE-Wert wird die Information über die Uhrzeit 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 zu, wenn dadurch die folgenden Situationen entstünden:

    • Konvertierung schneidet einen Teil vom VARCHAR-Wert ab. Zum Beispiel wandelt Snowflake VARCHAR(10) nicht zu VARCHAR(5) um, weder implizit noch explizit.

    • Dies führt zum Verlust von Ziffern mit Ausnahme der niederwertigsten Ziffern. Zum Beispiel schlägt der folgende Verlust von Ziffern fehl:

      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-Wert, einen FLOAT-Wert und einen VARIANT-Wert enthält. Der VARIANT-Wert wird aus JSON erstellt und enthält einen Gleitkommawert mit nachstehenden Nullen.

    CREATE OR REPLACE TABLE convert_test_zeros (
      varchar1 VARCHAR,
      float1 FLOAT,
      variant1 VARIANT);
    
    INSERT INTO convert_test_zeros 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 convert_test_zeros;
    
    Copy
    +----------+-----------------+---------------------------------+
    | 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 IFNULL-Aufrufe je nach Eingabewert leicht unterschiedliche Datentypen zurück:

    SELECT SYSTEM$TYPEOF(IFNULL(12.3, 0)),
           SYSTEM$TYPEOF(IFNULL(NULL, 0));
    
    Copy
    +--------------------------------+--------------------------------+
    | 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.

  • Some applications, such as SnowSQL, and some graphical user interfaces, such as Snowsight, apply their own conversion and formatting rules when they display data. For example, SnowSQL displays BINARY values as a string that contains only hexadecimal digits; that string is generated by implicitly calling a conversion function. Therefore, the data that SnowSQL displays might not unambiguously indicate which data conversions that Snowflake coerced.