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.

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

  • The :: operator, called the cast operator.

  • The appropriate SQL function; for example, 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'.

    • The following statement coerces the INTEGER value in column my_integer_column to FLOAT so that the value can be compared to the value my_float_column by using the < comparison operator:

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

Not all contexts — for example, not all operators — support coercion.

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

The cast operator has higher precedence than the arithmetic operator * (multiply), so the statement is interpreted as shown in the following example:

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

To cast the result of the expression height * width, use parentheses, as shown in the following example:

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

Betrachten Sie als weiteres Beispiel die folgende Anweisung:

SELECT -0.0::FLOAT::BOOLEAN;
Copy

You might expect this to be interpreted as shown in the following example:

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

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

However, the cast operator has higher precedence than the unary minus (negation) operator, so the statement is interpreted as shown in the following example:

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

Internally, the CAST function and the :: operator call the appropriate conversion function. For example, if you cast a NUMBER to a BOOLEAN, Snowflake calls the TO_BOOLEAN function. The usage notes for each conversion function apply when the function is called indirectly by using a cast, and also when the function is called directly. For example, if you execute CAST(my_decimal_column AS BOOLEAN), the rules for calling TO_BOOLEAN with a DECIMAL value apply. For convenience, the table includes links to the relevant conversion functions.

For more information about conversions between semi-structured types and structured types, see Konvertieren strukturierter und semistrukturierter Typen.

Quelldatentyp

Zieldatentyp

Umwandlung

Koersion

Konvertierungsfunktion

Anmerkungen

ARRAY

VARCHAR

TO_VARCHAR

None.

VARIANT

TO_VARIANT

None.

VECTOR

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

BINARY

VARCHAR

TO_VARCHAR

None.

VARIANT

TO_VARIANT

None.

BOOLEAN

DECFLOAT

TO_DECFLOAT

For example, from FALSE to 0.

NUMBER

TO_NUMBER

None.

VARCHAR

TO_VARCHAR

Zum Beispiel von TRUE zu 'true'.

VARIANT

TO_VARIANT

None.

DATE

TIMESTAMP

TO_TIMESTAMP

None.

VARCHAR

TO_VARCHAR

None.

VARIANT

TO_VARIANT

None.

DECFLOAT . (decimal floating-point numbers)

BOOLEAN

TO_BOOLEAN

Zum Beispiel von 0 zu FALSE.

FLOAT

TO_DOUBLE

None.

NUMBER[(p,s)]

TO_NUMBER

None.

VARCHAR

TO_VARCHAR

None.

FLOAT . (Gleitkommazahlen)

BOOLEAN

TO_BOOLEAN

Zum Beispiel von 0.0 zu FALSE.

DECFLOAT

TO_DECFLOAT

None.

NUMBER[(p,s)]

TO_NUMBER

None.

VARCHAR

TO_VARCHAR

None.

VARIANT

TO_VARIANT

None.

GEOGRAPHY

VARIANT

TO_VARIANT

None.

GEOMETRY

VARIANT

TO_VARIANT

None.

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

BOOLEAN

TO_BOOLEAN

Zum Beispiel von 0 zu FALSE.

DECFLOAT

TO_DECFLOAT

None.

FLOAT

TO_DOUBLE

None.

TIMESTAMP

TO_TIMESTAMP

[1]

VARCHAR

TO_VARCHAR

None.

VARIANT

TO_VARIANT

None.

OBJECT

ARRAY

TO_ARRAY

None.

VARCHAR

TO_VARCHAR

None.

VARIANT

TO_VARIANT

None.

TIME

VARCHAR

TO_VARCHAR

None.

VARIANT

TO_VARIANT

None.

TIMESTAMP

DATE

TO_DATE , DATE

None.

TIME

TO_TIME , TIME

None.

VARCHAR

TO_VARCHAR

None.

VARIANT

TO_VARIANT

None.

VARCHAR

BOOLEAN

TO_BOOLEAN

Zum Beispiel von 'false' zu FALSE.

DATE

TO_DATE , DATE

None.

DECFLOAT

TO_DECFLOAT

None.

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

None.

TIMESTAMP

TO_TIMESTAMP

None.

VARIANT

TO_VARIANT

None.

VARIANT

ARRAY

TO_ARRAY

None.

BOOLEAN

TO_BOOLEAN

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

DATE

TO_DATE , DATE

None.

FLOAT

TO_DOUBLE

None.

GEOGRAPHY

TO_GEOGRAPHY

None.

NUMBER[(p,s)]

TO_NUMBER

None.

OBJECT

TO_OBJECT

None.

TIME

TO_TIME , TIME

None.

TIMESTAMP

TO_TIMESTAMP

None.

VARCHAR

TO_VARCHAR

None.

VECTOR

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

VECTOR

ARRAY

TO_ARRAY

None.

Bemerkung

For each listed data type — for example, FLOAT — the rules apply to all aliases for that data type. For example, the rules for FLOAT apply to DOUBLE, which is an alias for FLOAT.

Nutzungshinweise

Wenn nicht anders angegeben, gelten die folgenden Regeln sowohl für das explizite als auch für das implizite Umwandeln:

  • Conversion depends not only on the data type, but also the value, of the source; for example:

    • Der Wert VARCHAR '123' kann in einen numerischen Wert umgewandelt werden, aber der Wert VARCHAR 'xyz' kann nicht in einen numerischen Wert umgewandelt werden.

    • The ability to cast a specific value of type VARIANT depends on the type of the data inside the VARIANT. For example, if the VARIANT contains a value of type TIME, then you can’t cast the VARIANT value to a TIMESTAMP value, because you can’t cast a TIME value to a TIMESTAMP value.

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

    We recommend passing in arguments of the same type or explicitly converting arguments if needed.

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

  • For some pairs of data types, conversion can result in loss of precision; for example:

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

    • Converting a value from fixed-point numeric — for example, NUMBER(38, 0) — to floating point — for example, FLOAT — can result in rounding or truncation if the fixed-point number can’t be precisely represented in a floating point number.

    • Bei der Umwandlung eines TIMESTAMP-Wertes in einen DATE-Wert wird die Information über die Uhrzeit entfernt.

  • Although Snowflake converts values in some situations where loss of precision can occur, Snowflake doesn’t allow conversion in other situations where a loss of precision would occur. For example, Snowflake doesn’t allow conversion when conversion would cause the following situations to happen:

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

    • Result in the loss of digits other than the least significant digits. For example, the following loss of digits fails:

      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.

    For example, the following statements create a table and insert a row that contains a VARCHAR value, a FLOAT value, and a VARIANT value. The VARIANT value is constructed from JSON that contains a floating-point value represented with trailing zeros:

    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                               |
    +----------+-----------------+---------------------------------+
    
  • Some operations can return different data types, depending on a conditional expression. For example, the following IFNULL calls return slightly different data types depending on the input values:

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

    If the expression has more than one possible data type, Snowflake chooses the data type based on the actual result. For more information about precision and scale in calculations, see Maßstab und Genauigkeit von arithmetischen Operationen. If the query generates more than one result — for example, multiple rows of results — Snowflake chooses a data type that is capable of holding each of the individual results.

  • Some applications, such as SnowSQL, and some graphical user interfaces, such as the Classic Console, 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.