SQL Datentypregeln

Databricks Runtime verwendet mehrere Regeln, um Konflikte zwischen Datentypen aufzulösen. Das Kernstück dieser Konfliktlösung ist die Rangfolgenliste für Typen, die definiert, ob Werte eines bestimmten Datentyps implizit auf einen anderen Datentyp heraufgestuft werden können.

Wenn Databricks Runtime eine Funktion aufruft, verwendet sie außerdem implizites Downcasting und Crosscasting, um Funktionsargumente nach Möglichkeit mit Funktionsparametern abzugleichen.

Typrangfolge

Databricks Runtime verwendet mehrere Regeln, die steuern, wie Konflikte zwischen Datentypen gelöst werden. Das Kernstück dieser Konfliktlösung ist die Rangfolgenliste für Typen, die definiert, ob Werte eines bestimmten Datentyps implizit auf einen anderen Datentyp heraufgestuft werden können.

Datentyp Rangfolgenliste (vom engsten zum breitesten)
TINYINT TINYINT – > SMALLINT > – INT – > BIGINT – > DECIMAL – FLOAT > – > DOUBLE
SMALLINT SMALLINT – > INT – > BIGINT – > DECIMAL – FLOAT >> – > DOUBLE
INT INT – > BIGINT – > DECIMAL – > FLOAT > – > DOUBLE
bigint BIGINT – > DECIMAL – > FLOAT > – > DOUBLE
DECIMAL DECIMAL – > FLOAT > – > DOUBLE
GLEITKOMMAZAHL FLOAT (1) - DOUBLE
Double Double
DATE DATE – > TIMESTAMP
timestamp timestamp
ARRAY ARRAY (2)
BINARY BINARY
BOOLEAN BOOLEAN
INTERVAL INTERVAL
MAP MAP (2)
STRING STRING
STRUCT STRUKTUR (2)

(1) Bei der am wenigsten häufig verwendeten Typauflösung wird FLOAT übersprungen, um Genauigkeitsverluste zu vermeiden.

(2) Für einen komplexen Typ wird die Rangfolgeregel rekursiv auf die zugehörigen Komponentenelemente angewendet.

Zeichenfolgenliterale und NULL

Für Zeichenfolgenliterale und nicht typisierten NULL-Wert gelten spezielle Regeln.

Ein NULL-Wert kann auf einen beliebigen anderen Typ heraufgestuft werden. Ein Zeichenfolgenliteral kann auf einen beliebigen einfachen Datentyp heraufgestuft werden.

Dies ist eine grafische Darstellung der Rangfolgenhierarchie:

Graphical representation of precedence rules

Am wenigsten häufig auftretende Typauflösung

Der am wenigsten gängigste Typ aus einer Gruppe von Typen ist der kleinste Typ, der von allen Elementen der Gruppe von Typen aus der Rangfolgenliste erreichbar ist.

Die am wenigsten häufig verwendete Typauflösung wird für Folgendes verwendet:

  • Entscheiden Sie, ob eine Funktion, die einen Parameter eines bestimmten Typs erwartet, mit einem Argument eines schmaleren Typs aufgerufen werden kann.
  • Leiten Sie den Argumenttyp für eine Funktion ab, die einen freigegebenen Argumenttyp für mehrere Parameter erwartet, z. B. coalescein, leastoder greatest.
  • Leiten Sie die Operandentypen für Operatoren ab, z. B. arithmetische Operationen oder Vergleiche.
  • Leiten Sie den Ergebnistyp für Ausdrücke ab, z. B. den Case-Ausdruck.
  • Leiten Sie die Element-, Schlüssel- oder Werttypen für Array- und Zuordnungskonstruktoren ab.
  • Leiten Sie den Ergebnistyp der UNION-, INTERSECT- oder EXCEPT-Set-Operatoren ab.

Spezielle Regeln werden angewendet, wenn der am wenigsten häufig verwendete Typ in FLOAT aufgelöst wird:

Wenn einer der beitragenden Typen INTEGER ist, oder der am wenigsten häufig vorkommende Typ an BIGINTDECIMAL gepusht DOUBLE wird, um einen potenziellen Verlust von Ziffern zu vermeiden.

Implizites Downcasting und Crosscasting

Databricks Runtime verwenden diese Formen der impliziten Umwandlung nur beim Funktions- und Operatoraufruf und nur dort, wo sie die Absicht eindeutig bestimmen können.

  • Implizites Downcasting

    Implizites Downcasting gibt automatisch einen breiteren Typ in einen schmaleren Typ um, ohne dass Sie die Umwandlung explizit angeben müssen. Downcasting ist praktisch, birgt aber das Risiko unerwarteter Laufzeitfehler, wenn der tatsächliche Wert im schmalen Typ nicht darstellbar ist.

  • Implizites Crosscasting

    Implizites Crosscasting gibt einen Wert aus einer Typfamilie in eine andere um, ohne dass Sie die Umwandlung explizit angeben müssen. Databricks Runtime unterstützt die implizite Umwandlung von einem einfachen Typ in STRING , aber nicht umgekehrt. Ein Literal kann jedoch in STRING einen anderen einfachen Typ umgeformt werden, da Databricks Runtime die Sicherheit der Umwandlung während der Kompilierung der Abfrage ableiten können. Werte aller einfachen Typen können zwar als s dargestellt STRING werden, dies ist jedoch offensichtlich nicht der Fall, wenn ein Wert in einen anderen einfachen Typ umgerechnet STRING wird.

Umwandlung beim Funktionsaufruf

Bei einer aufgelösten Funktion oder einem aufgelösten Operator gelten die folgenden Regeln in der Reihenfolge, in der sie aufgelistet sind, für jedes Parameter- und Argumentpaar:

  • Wenn ein unterstützter Parametertyp Teil der Typrangfolgenkette des Arguments ist, Databricks Runtime das Argument auf diesen Parametertyp heraufstufen.

    In den meisten Fällen gibt die Funktionsbeschreibung explizit die unterstützten Typen oder Die Kette an, z. B. "beliebiger numerischer Typ".

    Beispielsweise wird sin(expr) verwendet, akzeptiert aber alle numerischen Werte.

  • Wenn der erwartete Parametertyp ein und das Argument ein einfacher Typ ist, Databricks Runtime wird STRING das Argument in den Zeichenfolgenparametertyp gekreuzt.

    Beispielsweise wird von substr(str, start, len) erwartet, dass ein STRING ist. Stattdessen können Sie einen numerischen oder datetime-Typ übergeben.

  • Wenn die Funktion einen numerischen Typ erwartet, z. B. einen INTEGER - oder einen DATE -Typ, aber das Argument ein allgemeinerer Typ ist, z. B. oder DOUBLE , Databricks Runtime das Argument implizit in diesen TIMESTAMP Parametertyp herab.

    Ein date_add(Datum, Tage) erwartet z. B. und INTEGER .

    Wenn Sie mit einem und einem aufrufen, Databricks Runtime durch Entfernen der Zeitkomponente und des in ein -Element in date_add()TIMESTAMP einen BIGINT -Element TIMESTAMPDATEBIGINTINTEGER umgeschaltet.

  • Andernfalls löst Databricks Runtime einen Fehler aus.

Beispiele

Die Coalesce-Funktion akzeptiert alle Argumenttypen, solange sie einen am wenigsten gemeinsamen Typ aufweisen.

Der Ergebnistyp ist der am wenigsten gängigsten Typ der Argumente.

-- The least common type of TINYINT and BIGINT is BIGINT
> SELECT typeof(coalesce(1Y, 1L, NULL));
  BIGINT

-- INTEGER and DATE do not share a precedence chain
> SELECT typeof(coalesce(1, DATE'2020-01-01'));
Error: Incompatible types [INT, DATE]

-- Both are ARRAYs and the elements have a least common type
> SELECT typeof(coalesce(ARRAY(1Y), ARRAY(1L)))
  ARRAY<BIGINT>

-- The least common type of INT and FLOAT is DOUBLE
> SELECT typeof(coalesce(1, 1F))
  DOUBLE

> SELECT typeof(coalesce(1L, 1F))
  DOUBLE

> SELECT (typeof(coalesce(1BD, 1F))
  DOUBLE

Die Teilzeichenfolgenfunktion erwartet Argumente vom Typ für die Zeichenfolge und für die INTEGER Start- und Längenparameter.

-- Promotion of TINYINT to INTEGER
> SELECT substring('hello', 1Y, 2);
he

-- No casting
> SELECT substring('hello', 1, 2);
He

-- Casting of a literal string
> SELECT substring('hello', '1', 2);
he

-- Downcasting of a BIGINT to an INT
> SELECT substring('hello', 1L, 2);
he

-- No crosscasting from STRING to INTEGER
> SELECT substring('hello', str, 2)
  FROM VALUES(CAST('1' AS STRING)) AS T(str);
Error: Argument 2 requires an INT type.

-- Crosscasting from INTEGER to STRING
> SELECT substring(12345, 2, 2);
 23

|| (CONCAT) ermöglicht implizites Crosscasting in eine Zeichenfolge.

-- A numeric is cast to STRING
SELECT 'This is a numeric: ' || 5.4E10;
This is a numeric: 5.4E10

-- A date is cast to STRING
SELECT 'This is a date: ' || DATE'2021-11-30';
This is a date: 2021-11-30

date_add können mit oder aufgrund BIGINT von implizitem Downcasting aufgerufen werden.

SELECT date_add(TiMESTAMP'2011-11-30 08:30:00', 5L);
2011-12-05