Freigeben über


SQL-Datentypregeln

Gilt für:mit Häkchen markiert: Ja Databricks SQL mit Häkchen markiert: Ja Databricks Runtime

Azure Databricks verwendet mehrere Regeln, um Konflikte zwischen Datentypen zu lösen:

Sie können auch explizit zwischen vielen Typen umwandeln:

Typ-Heraufufung

Bei der Typerweiterung wird ein Typ in einen anderen Typ derselben Typfamilie umgewandelt, der alle möglichen Werte des ursprünglichen Typs enthält. Daher ist die Typerweiterung ein sicherer Vorgang. TINYINT hat z. B. einen Bereich von -128 bis 127. Alle möglichen Werte können sicher auf INTEGER erweitert werden.

Typrangfolgenliste

Die Typrangfolgenliste bestimmt, ob Werte eines bestimmten Datentyps implizit auf einen anderen Datentyp heraufgestuft werden können.

Datentyp Rangfolgeliste (vom niedrigsten zum höchsten Typ)
TINYINT TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE
SMALLINT SMALLINT - INT ->> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE
INT INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE
BIGINT BIGINT -> DEZIMAL -> FLOAT (1) -> DOUBLE
DECIMAL DEZIMAL -> FLOAT (1) -> DOUBLE
FLOAT FLOAT (1) -> DOUBLE
DOUBLE DOUBLE
DATE DATUM -> ZEITSTEMPEL
TIMESTAMP TIMESTAMP
ARRAY ARRAY (2)
BINARY BINARY
BOOLEAN BOOLEAN
INTERVAL INTERVAL
GEOGRAFIE GEOGRAFIE(ANY)
GEOMETRIE GEOMETRY(ANY)
MAP MAP (2)
STRING STRING
STRUCT STRUKTUR (2)
VARIANT VARIANT
OBJECT OBJEKT (3)

(1) Für die am wenigsten häufige TypauflösungFLOAT wird übersprungen, um Genauigkeitsverluste zu vermeiden.

(2) Bei einem komplexen Typ wendet die Rangfolgeregel rekursiv auf die Komponentenelemente an.

(3)OBJECT existiert nur innerhalb eines VARIANT.

Zeichenketten und NULL

Für STRINGs und nicht typisierte NULL-Werte gelten spezielle Regeln:

  • NULL Der erste Typ kann in jeden anderen Typ umgewandelt werden.
  • STRING kann befördert werden zu BIGINT, BINARY, BOOLEAN, DATE, DOUBLE, INTERVAL, and TIMESTAMP. Wenn der tatsächliche Zeichenfolgenwert nicht in den kleinsten gemeinsamen Typ umgewandelt werden kann, gibt Azure Databricks einen Laufzeitfehler aus. Beim Erweitern zu INTERVAL muss der Zeichenfolgenwert mit den Intervalleeinheiten übereinstimmen.

Typrangfolgendiagramm

Dies ist eine grafische Darstellung der Rangfolgenhierarchie, die die Typrangfolgenliste sowie Regeln zu Zeichenfolgen und NULLs kombiniert.

Grafische Darstellung von Rangfolgeregeln

Auflösung des kleinsten gemeinsamen Typs

Der kleinste gemeinsame Typ aus einer Reihe von Typen ist der niedrigste Typ, der aus der Typrangfolgendiagramm von allen Elementen der Reihe von Typen erreicht werden kann.

Die Auflösung des kleinsten gemeinsamen Typs wird für Folgendes verwendet:

  • Entscheiden, ob eine Funktion, die einen Parameter eines angegebenen Typs erwartet, mit einem Argument eines niedrigeren Typs aufgerufen werden kann.
  • Leiten Sie den Argumenttyp für eine Funktion ab, die einen gemeinsamen Argumenttyp für mehrere Parameter erwartet, z. B. koaleszieren, in, kleinst oder größt.
  • Ableiten der Operandentypen für Operatoren wie z. B. arithmetische Operationen oder Vergleiche.
  • Leiten Sie den Ergebnistyp für Ausdrücke wie den Fallausdruck ab.
  • Leiten Sie die Element-, Schlüssel- oder Werttypen für Array- und Map-Konstruktoren ab.
  • Ableiten des Ergebnistyps der UNION-, INTERSECT- oder EXCEPT-Mengenoperatoren.

Spezielle Regeln werden angewendet, wenn der kleinste gemeinsame Typ in FLOAT aufgelöst wird. Wenn einer der beitragenden Typen ein genauer numerischer Typ (TINYINT, SMALLINT, INTEGER, BIGINT oder DECIMAL) ist, wird der kleinste gemeinsame Typ per Push auf DOUBLE gesetzt, um einen potenziellen Verlust von Ziffern zu vermeiden.

Wenn der am wenigsten verbreitete Typ eine STRING ist, wird die Sortierung gemäß den Sortierungsrangfolgeregeln berechnet.

Implizites Downcasting und Crosscasting

Azure Databricks nutzt diese Formen der impliziten Umwandlung nur beim Funktions- und Operatoraufruf und nur dort, wo die Absicht eindeutig bestimmt werden kann.

  • Implizite Abwärtsumwandlung

    Implizites Downcasting wandelt automatisch einen höheren Typ in einen niedrigeren 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 niedrigeren Typ nicht darstellbar ist.

    Bei Downcasting wird die Typrangfolgenliste in umgekehrter Reihenfolge angewendet. Die Datentypen GEOGRAPHY und GEOMETRY werden niemals heruntergestuft.

  • Implizites Crosscasting

    Implizites Crosscasting wandelt einen Wert aus einer Typfamilie in eine andere um, ohne dass Sie die Umwandlung explizit angeben müssen.

    Azure Databricks unterstützt implizites Crosscasting von:

    • Beliebiger einfacher Typ, außer BINARY, , GEOGRAPHYund GEOMETRY, bis STRING.
    • A STRING für einen beliebigen einfachen Typ mit Ausnahme von GEOGRAPHY und GEOMETRY.

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-Argumentpaar:

  • Wenn ein unterstützter Parametertyp Teil des Typrangfolgediagramms des Arguments ist, stuft Azure Databricks das Argument zu diesem Parametertyp hoch.

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

    So wird z. B. sin(expr) ausgeführt auf DOUBLE, akzeptiert jedoch jede Zahl.

  • Wenn der erwartete Parametertyp ein STRING ist und das Argument ein einfacher Typ ist, wandelt Azure Databricks das Argument in den Zeichenfolgenparametertyp um.

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

  • Wenn der Argumenttyp ein STRING und der erwartete Parametertyp ein einfacher Typ ist, überschreibt Azure Databricks das Zeichenfolgenargument auf den breitesten unterstützten Parametertyp.

    Beispielsweise erwartet date_add(Datum, Tage) ein DATE und ein INTEGER.

    Wenn Sie date_add() mit zwei STRING aufrufen, konvertiert Azure Databricks den ersten STRING zu DATE und den zweiten STRING zu einem INTEGER.

  • Wenn die Funktion einen numerischen Typ erwartet, z. B. einen INTEGERTyp oder einen DATE Typ, aber das Argument ist ein allgemeinerer Typ, z. B. ein DOUBLE oder TIMESTAMP, Azure Databricks setzt das Argument implizit in diesen Parametertyp herunter .

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

    Wenn Sie date_add() mit einer TIMESTAMP und einer BIGINT aufrufen, wandelt Azure Databricks die TIMESTAMP zu einer DATE um, indem es die Zeitkomponente entfernt, und wandelt die BIGINT zu einer INTEGER um.

  • Andernfalls löst Azure Databricks einen Fehler aus.

Examples

Die coalesce Funktion akzeptiert einen beliebigen Satz von Argumenttypen, solange sie einen am wenigsten häufig verwendeten Typ aufweisen.

Der Ergebnistyp ist der kleinste gemeinsame 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 or support crosscasting in either direction.
> SELECT typeof(coalesce(1, DATE'2020-01-01'));
  Error: DATATYPE_MISMATCH.DATA_DIFF_TYPES

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

-- The least common type between an INT and STRING is BIGINT
> SELECT typeof(coalesce(5, '6'));
  BIGINT

-- The least common type is a BIGINT, but the value is not BIGINT.
> SELECT coalesce('6.1', 5);
  Error: CAST_INVALID_INPUT

-- The least common type between a DECIMAL and a STRING is a DOUBLE
>  SELECT typeof(coalesce(1BD, '6'));
  DOUBLE

-- Two distinct explicit collations result in an error
>  SELECT collation(coalesce('hello' COLLATE UTF8_BINARY,
                             'world' COLLATE UNICODE));
  Error: COLLATION_MISMATCH.EXPLICIT

-- The resulting collation between two distinct implicit collations is indeterminate
>  SELECT collation(coalesce(c1, c2))
     FROM VALUES('hello' COLLATE UTF8_BINARY,
                 'world' COLLATE UNICODE) AS T(c1, c2);
  NULL

-- The resulting collation between a explicit and an implicit collations is the explicit collation.
> SELECT collation(coalesce(c1 COLLATE UTF8_BINARY, c2))
    FROM VALUES('hello',
                'world' COLLATE UNICODE) AS T(c1, c2);
  UTF8_BINARY

-- The resulting collation between an implicit and the default collation is the implicit collation.
> SELECT collation(coalesce(c1, 'world'))
    FROM VALUES('hello' COLLATE UNICODE) AS T(c1, c2);
  UNICODE

-- The resulting collation between the default collation and the indeterminate collation is the default collation.
> SELECT collation(coalesce(coalesce('hello' COLLATE UTF8_BINARY, 'world' COLLATE UNICODE), 'world'));
  UTF8_BINARY

-- Least common type between GEOGRAPHY(srid) and GEOGRAPHY(ANY)
> SELECT typeof(coalesce(st_geogfromtext('POINT(1 2)'), to_geography('POINT(3 4)'), NULL));
  geography(any)

-- Least common type between GEOMETRY(srid1) and GEOMETRY(srid2)
> SELECT typeof(coalesce(st_geomfromtext('POINT(1 2)', 4326), st_geomfromtext('POINT(3 4)', 3857), NULL));
  geometry(any)

-- Least common type between GEOMETRY(srid1) and GEOMETRY(ANY)
> SELECT typeof(coalesce(st_geomfromtext('POINT(1 2)', 4326), to_geometry('POINT(3 4)'), NULL));
  geometry(any)

Die substring Funktion erwartet Argumente vom Typ STRING für die Zeichenfolge und INTEGER für die 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

-- Crosscasting from STRING to INTEGER
> SELECT substring('hello', str, 2)
  FROM VALUES(CAST('1' AS STRING)) AS T(str);
 he

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

|| (VERKETTEN) ermöglicht implizites Crosscasting zu Zeichenfolgen.

-- 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 kann aufgrund eines impliziten Downcastings mit einer TIMESTAMP oder BIGINT aufgerufen werden.

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

date_add kann durch implizites Cross-Casting mit STRING aufgerufen werden.

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