Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
S’applique à :
Databricks SQL
Databricks Runtime
Azure Databricks utilise plusieurs règles pour résoudre les conflits entre les types de données :
- La promotion étend en toute sécurité un type à un type plus large.
- La conversion descendante implicite réduit un type. Le contraire de la promotion.
- La transdiffusion implicite transforme un type en un type d’une autre famille de types.
Vous pouvez aussi effectuer un cast explicite entre de nombreux types :
- fonction de cast effectue un cast entre la plupart des types et retourne des erreurs si il échoue.
- try_cast fonction fonctionne comme la fonction cast , mais retourne NULL lorsqu’elle a passé des valeurs non valides.
- D’autres fonctions intégrées effectuent un cast entre des types en utilisant les directives de format fournies.
Promotion de type
La promotion de type est le processus de conversion d’un type en un autre type de la même famille de types qui contient toutes les valeurs possibles du type d’origine.
Par conséquent, la promotion de type est une opération sécurisée. Par exemple, TINYINT a une plage comprise entre -128 et 127. Toutes ses valeurs possibles peuvent être promues en toute sécurité vers INTEGER.
Liste de priorité des types
La liste de précédence de type définit si les valeurs d’un type de données donné peuvent être implicitement promues vers un autre type de données.
| Type de données | Liste de précédences (de la plus étroite au plus large) |
|---|---|
| TINYINT | TINYINT -> SMALLINT -> INT -> BIGINT -> DÉCIMAL -> FLOAT (1) -> DOUBLE |
| SMALLINT | SMALLINT -> INT -> BIGINT -> DÉCIMAL -> FLOAT (1) -> DOUBLE |
| INT | INT -> BIGINT -> DÉCIMAL -> FLOAT (1) -> DOUBLE |
| BIGINT | BIGINT -> DÉCIMAL -> FLOAT (1) -> DOUBLE |
| DECIMAL | DÉCIMAL -> FLOAT (1) -> DOUBLE |
| FLOAT | FLOAT (1) -> DOUBLE |
| DOUBLE | DOUBLE |
| DATE | DATE -> HORODATAGE |
| TIMESTAMP | TIMESTAMP |
| ARRAY | ARRAY (2) |
| BINARY | BINARY |
| BOOLEAN | BOOLEAN |
| INTERVAL | INTERVAL |
| GÉOGRAPHIE | GÉOGRAPHIE (TOUT) |
| GÉOMÉTRIE | GÉOMÉTRIE(ANY) |
| MAP | MAP (2) |
| STRING | STRING |
| STRUCT | STRUCT (2) |
| VARIANT | VARIANT |
| OBJECT | OBJECT (3) |
(1) Pour une résolution de FLOAT, il est ignoré pour éviter une perte de précision.
(2) Pour un type complexe, la règle de précédence s’applique de manière récursive à ses éléments de composant.
(3)OBJECT existe uniquement dans un VARIANT.
Chaînes et NULL
Des règles spéciales s’appliquent pour STRING et NULL non typé :
-
NULLpeut être promu en tout autre type. -
STRINGpeut être promu enBIGINT,BINARY,BOOLEAN,DATE,DOUBLE,INTERVALetTIMESTAMP. Si la valeur réelle de la chaîne ne peut pas être castée en type le moins commun, Azure Databricks génère une erreur d’exécution. Lors de la promotion enINTERVAL, la valeur de la chaîne doit correspondre aux unités d’intervalle.
Graphique de priorité des types
Il s’agit d’une représentation graphique de la hiérarchie de précédence, combinant la liste de précédence de type et les règles pour les chaînes et les NULLs.
Résolution du type le moins courant
Le type le moins courant d’un ensemble de types est le type le plus étroit accessible à partir du graphique de précédence de type par tous les éléments de l’ensemble de types.
La résolution du type le moins courant est utilisée pour :
- Décider si une fonction qui attend un paramètre d’un type donné peut être appelée à l’aide d’un argument d’un type plus étroit.
- Dérivez le type d’argument d’une fonction qui attend un type d’argument partagé pour plusieurs paramètres, tels que coalesce, in, le plus petit ou le plus grand.
- Déduire les types d’opérandes pour des opérateurs tels que des opérations arithmétiques ou des comparaisons.
- Dérivez le type de résultat pour les expressions telles que l’expression de cas.
- Dérivez les types d’élément, de clé ou de valeur pour les constructeurs de tableau et de mappage .
- Dérivez le type de résultat des opérateurs d'ensemble UNION, INTERSECT ou EXCEPT.
Des règles spéciales sont appliquées si le type le moins courant se résout en FLOAT. Si l’un des types contribuant est un type numérique exact (TINYINT, SMALLINT, INTEGER, BIGINT ou DECIMAL), le type le moins courant est poussé vers DOUBLE pour éviter la perte potentielle de chiffres.
Lorsque le type le moins courant est un STRING le classement est calculé en suivant les règles de précédence de classement .
Downcasting et crosscasting implicites
Azure Databricks emploie ces formes de cast de type implicite uniquement lors de l’appel de fonctions et d’opérateurs, et uniquement lorsqu’il peut déterminer l’intention sans ambiguïté.
Conversion implicite vers le bas
Le downcasting implicite caste automatiquement un type plus large en un type plus étroit sans que vous ayez à spécifier explicitement le cast. Le downcasting est pratique, mais il comporte le risque d’erreurs d’exécution inattendues si la valeur réelle n’est pas représentable dans le type étroit.
Le downcasting applique la liste de priorité des types dans l’ordre inverse. Les types de données
GEOGRAPHYetGEOMETRYne font jamais l’objet d’un downcasting.
Transposition croisée implicite
Le crosscasting implicite caste une valeur d’une famille de types à une autre sans que vous ayez besoin de spécifier explicitement le cast.
Azure Databricks prend en charge le crosscasting implicite à partir de :
- Tout type simple, sauf
BINARY,GEOGRAPHYetGEOMETRY, àSTRING. - Une valeur
STRINGpeut être convertie vers n’importe quel type simple, saufGEOGRAPHYetGEOMETRY.
- Tout type simple, sauf
Cast lors l’appel d’une fonction
Étant donné une fonction ou un opérateur résolu, les règles suivantes s’appliquent, dans l’ordre dans lequel elles sont répertoriées, pour chaque paire de paramètres et d’arguments :
Si un type de paramètre pris en charge fait partie du graphique de précédence de type de l’argument, Azure Databricks promeut l’argument en ce type de paramètre.
Dans la plupart des cas, la description de la fonction indique explicitement les types pris en charge ou la chaîne, comme « tout type numérique ».
Par exemple, sin(expr) fonctionne sur
DOUBLE, mais accepte n’importe quelle valeur numérique.Si le type de paramètre attendu est un
STRINGet que l’argument est un type simple, Azure Databricks convertit l’argument en type de paramètre chaîne.Par exemple, substr(str, start, len) s’attend à ce que
strsoit un typeSTRING. Au lieu de cela, vous pouvez transmettre un type numérique ou DateHeure.Si le type de l’argument est un
STRINGet que le type de paramètre attendu est un type simple, Azure Databricks convertit l’argument de chaîne en le type de paramètre pris en charge le plus large.Par exemple, date_add(date, jours) attend un
DATEet unINTEGER.Si vous appelez
date_add()avec deuxSTRINGs, Azure Databricks convertit la premièreSTRINGenDATEet la secondeSTRINGen unINTEGER.Si la fonction attend un type numérique, tel qu’un
INTEGERtype ou unDATEtype, mais que l’argument est un type plus général, tel qu’unDOUBLEouTIMESTAMP, Azure Databricks effectue implicitement une conversion de l’argument au type de ce paramètre.Par exemple, un date_add(date, jours) attend un
DATEet unINTEGER.Si vous invoquez
date_add()avec unTIMESTAMPet unBIGINT, Azure Databricks effectue un downcast deTIMESTAMPenDATEen supprimant le composant temporel et leBIGINTen unINTEGER.Sinon, Azure Databricks génère une erreur.
Examples
La coalesce fonction accepte tout ensemble de types d’arguments tant qu’ils partagent un type moins commun.
Le type du résultat est le type le moins courant des arguments.
-- 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)
La substring fonction attend des arguments de type STRING pour la chaîne et INTEGER pour les paramètres de début et de longueur.
-- 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
|| (CONCAT) permet la conversion implicite en chaîne de caractères.
-- 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 peut être invoqué avec un TIMESTAMP ou un BIGINT en raison d'une transformation implicite.
> SELECT date_add(TIMESTAMP'2011-11-30 08:30:00', 5L);
2011-12-05
date_add peut être appelée avec STRING en raison du convertissement croisé implicite.
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05