Konversionsregeln

Die Umwandlung umfasst unter anderem das Umwandeln, Erzwingen und Supertyping.

  • Das Umwandeln ist eine explizite Konversion, für die die Funktion CAST() verwendet wird.
  • Das Erzwingen ist eine implizite Konversion, die von Cloud Spanner SQL unter den unten beschriebenen Bedingungen automatisch ausgeführt wird.
  • Ein Supertyp ist ein gemeinsamer Typ, in den zwei oder mehr Ausdrücke erzwungen werden können.

Außerdem gibt es Konversionen mit eigenen Funktionsnamen, z. B. PARSE_DATE(). Weitere Informationen zu diesen Funktionen finden Sie unter Konversionsfunktionen.

Umwandeln und Erzwingen im Vergleich

In der folgenden Tabelle sind alle möglichen Umwandlungs- und Erzwingungsmöglichkeiten für SQL-Datentypen von Cloud Spanner zusammengefasst. Die Spalte Erzwingen in gilt für alle Ausdrücke eines bestimmten Datentyps, z. B. eine Spalte.

Von Typ Umwandeln in Erzwingen in
INT64 BOOL
INT64
NUMERISCHE
FLOAT64
STRING
NUMERIC
FLOAT64
NUMERIC INT64
NUMERISCHE
FLOAT64
STRING
FLOAT64
FLOAT64 INT64
NUMERISCHE
FLOAT64
STRING
 
BOOL BOOL
INT64
STRING
 
STRING BOOL
INT64
NUMERISCHE
FLOAT64
STRING
BYTES
DATE
TIMESTAMP
 
BYTES STRING
BYTES
 
DATE STRING
DATUM
TIMESTAMP
TIMESTAMP STRING
DATUM
TIMESTAMP
 
ARRAY ARRAY  
STRUCT STRUCT  

Umwandeln

Die meisten Datentypen können mit der Funktion CAST von einem Typ in einen anderen übertragen werden. Bei Verwendung von CAST kann eine Abfrage fehlschlagen, wenn Cloud Spanner SQL die Umwandlung nicht durchführen kann. Wenn Sie Ihre Abfragen vor diesen Fehlern schützen möchten, können Sie SAFE_CAST verwenden. Weitere Informationen zu den Regeln für CAST, SAFE_CAST und andere Umwandlungsfunktionen finden Sie unter Konvertierungsfunktionen.

Erzwingen

Cloud Spanner SQL wandelt den Ergebnistyp eines Argumentausdrucks bei Bedarf in einen anderen Typ um, um Funktionssignaturen abzugleichen. Wenn beispielsweise die Funktion func() so definiert ist, dass sie ein einzelnes Argument vom Typ FLOAT64 annimmt, und ein Ausdruck als Argument mit einem Ergebnistyp von INT64 verwendet wird, dann wird das Ergebnis des Ausdrucks in den Typ FLOAT64 umgewandelt, bevor func() berechnet wird.

Supertypen

Ein Supertyp ist ein gemeinsamer Typ, in den zwei oder mehr Ausdrücke erzwungen werden können. Supertypen werden mit Satzvorgängen wie UNION ALL und Ausdrücken wie CASE verwendet, die mehrere Argumente mit Übereinstimmungstypen erwarten. Jeder Typ hat einen oder mehrere Supertypen, einschließlich seiner, die seine Gruppe von Supertypen definieren.

Eingabetyp Supertypen
BOOL BOOL
INT64 INT64
FLOAT64
NUMMER
FLOAT64 FLOAT64
NUMERIC NUMERIC
FLOAT64
STRING STRING
DATE DATE
TIMESTAMP TIMESTAMP
BYTES BYTES
STRUCT STRUCT mit denselben Feldpositionstypen.
ARRAY ARRAY mit denselben Elementtypen.

Wenn Sie den Supertyp für eine Reihe von Eingabetypen ermitteln möchten, legen Sie zuerst die Schnittmenge der Supertypen für jeden Eingabetyp fest. Wenn dieser Satz leer ist, haben die Eingabetypen keinen gemeinsamen Supertyp. Wenn dieser Satz nicht leer ist, ist der allgemeine Supertyp in der Regel der besondere Typ in diesem Satz. Im Allgemeinen ist der spezifischste Typ der Typ mit der restriktivsten Domain.

Beispiele

Eingabetypen Gemeinsamer Supertyp Rückgabe: Hinweise
INT64
FLOAT64
FLOAT64 FLOAT64 Wenn Sie INT64 und BOOL supertypisieren, ist dies erfolgreich, da sie einen gemeinsamen Supertyp, FLOAT64, haben.
INT64
BOOL
Fehler Wenn Sie INT64 und BOOL supertypisieren, schlägt dies fehl, da sie keinen gemeinsamen Supertyp haben.

Exakte und ungenaue Typen

Numerische Typen können exakt oder ungenau sein. Für die Supertypisierung gilt: Wenn alle Eingabetypen exakte Typen sind, kann der resultierende Supertyp nur ein exakter Typ sein.

Die folgende Tabelle enthält die genauen, exakten numerischen Datentypen.

Exakte Typen Ungenaue Typen
INT64
NUMERISCHE
FLOAT64

Beispiele

Eingabetypen Gemeinsamer Supertyp Rückgabe: Hinweise
INT64
FLOAT64
FLOAT64 FLOAT64 Wenn die Supertyping-Funktion auf INT64 und DOUBLE angewendet wird, ist das Supertypisieren erfolgreich, da exakte und ungenaue numerische Typen supertypisiert werden.

Typenspezifität

Jeder Typ hat eine Domain mit unterstützten Werten. Ein Typ mit einer niedrigeren Domain ist spezifischer als ein Typ mit einer größeren Domain. Exakte Typen sind spezifischer als ungenaue Typen, da diese einen größeren Bereich von unterstützten Domainwerten enthalten als exakte Typen. Beispielsweise ist INT64 spezifischer als FLOAT64.

Supertypen und Literale

Supertypregeln für Literale sind großzügiger als für normale Ausdrücke und stimmen mit impliziten Erzwingungsregeln überein. Der folgende Algorithmus wird verwendet, wenn der Eingabesatz Typen enthält, die sich auf Literale beziehen:

  • Wenn der Satz Nicht-Literale enthält, suchen Sie den Satz allgemeiner Supertypen der Nicht-Literale.
  • Wenn es mindestens einen möglichen Supertyp gibt, suchen Sie nach dem spezifischsten Typ, für den die verbleibenden Literaltypen implizit erzwungen werden können, und geben Sie diesen Supertyp zurück. Andernfalls gibt es keinen Supertyp.
  • Wenn der Satz nur Typen enthält, die sich auf Literale beziehen, berechnen Sie den Supertyp der Literaltypen.
  • Wenn alle Eingabetypen mit NULL-Literalen verknüpft sind, lautet der resultierende Supertyp INT64.
  • Wenn kein gemeinsamer Supertyp gefunden wird, wird ein Fehler erzeugt.

Beispiele

Eingabetypen Gemeinsamer Supertyp Rückgabe:
INT64-Literal
UINT64-Ausdruck
UINT64 UINT64
TIMESTAMP-Ausdruck
STRING-Literal
TIMESTAMP TIMESTAMP
NULL-Literal
NULL-Literal
INT64 INT64
BOOL-Literal
TIMESTAMP-Literal
Fehler