MaxCompute SQL permet la conversion entre différents types de données. Ces conversions peuvent être explicites ou implicites.
Conversion explicite
Une conversion explicite utilise la fonction CAST pour convertir une valeur d'un type de données vers un autre. Le tableau suivant présente les conversions explicites prises en charge par MaxCompute SQL. Pour plus d'informations sur cette fonction, consultez CAST.
|
De/vers |
BIGINT |
DOUBLE |
STRING |
DATETIME |
BOOLEAN |
DECIMAL |
FLOAT |
|
BIGINT |
N/A |
O |
O |
N |
O |
O |
O |
|
DOUBLE |
O |
N/A |
O |
N |
O |
O |
O |
|
STRING |
O |
O |
N/A |
O |
O |
O |
O |
|
DATETIME |
N |
N |
O |
N/A |
N |
N |
N |
|
BOOLEAN |
O |
O |
O |
N |
N/A |
O |
O |
|
DECIMAL |
O |
O |
O |
N |
O |
N/A |
O |
|
FLOAT |
O |
O |
O |
N |
O |
O |
N/A |
Dans ce tableau, O indique que la conversion est prise en charge, N qu'elle ne l'est pas, et N/A signifie qu'aucune conversion n'est nécessaire. Toute tentative de conversion explicite non prise en charge renvoie une erreur.
-
Exemple de données
RemarqueLes exemples suivants utilisent une table
usercontenant ces données d'exemple.create table if not exists user ( user_name string, user_id bigint, age bigint ); insert into user values ('zhangsan',111,20); -
Exemples
SELECT CAST(user_id AS DOUBLE) AS new_id from user; SELECT CAST('2015-10-01 00:00:00' AS DATETIME) AS new_date; SELECT CAST(ARRAY(1,2,3) AS ARRAY<STRING>); SELECT CONCAT_WS(',', CAST(ARRAY(1, 2) AS ARRAY<STRING>));
Remarques et limitations d'utilisation
Lorsque vous convertissez un type DOUBLE en BIGINT, la partie décimale est tronquée. Par exemple,
CAST(1.6 AS BIGINT) = 1.La conversion d'une STRING au format DOUBLE vers BIGINT passe d'abord par le type DOUBLE, puis vers BIGINT, ce qui entraîne la troncature de la partie décimale. Par exemple,
CAST("1.6" AS BIGINT) = 1.Il est possible de convertir une STRING au format BIGINT en DOUBLE. Le résultat comporte alors une décimale. Par exemple,
CAST("1" AS DOUBLE) = 1.0.Les conversions vers le type DATETIME utilisent le format par défaut
yyyy-mm-dd hh:mi:ss.Des fonctions intégrées permettent de convertir certains types de données qui ne supportent pas la conversion explicite directe. Ainsi, la fonction
TO_CHARconvertit une valeur BOOLEAN en STRING. Pour plus de détails, consultez TO_CHAR. La fonctionTO_DATEpermet également de convertir une valeur STRING en DATETIME. Voir TO_DATE pour plus d'informations.Si la plage de valeurs d'un DECIMAL est dépassée, l'opération
CAST STRING TO DECIMALpeut provoquer des erreurs de dépassement ou une troncature des données.La conversion explicite d'un DECIMAL en DOUBLE ou FLOAT peut entraîner une perte de précision. Pour les scénarios nécessitant une haute précision, tels que les calculs monétaires, il est recommandé d'utiliser le type DECIMAL.
-
MaxCompute prend en charge les conversions de types pour les types de données complexes. Pour les conversions implicites et explicites d'un type complexe, ses sous-types doivent également être convertibles. Lors de la conversion d'un STRUCT, les noms des champs n'ont pas besoin de correspondre, mais leur nombre doit être identique et les champs correspondants doivent être implicitement ou explicitement convertibles. Exemples :
ARRAY<BIGINT>peut être converti implicitement ou explicitement enARRAY<STRING>.ARRAY<BIGINT>peut être converti explicitement enARRAY<INT>, mais pas implicitement.ARRAY<BIGINT>ne peut être converti ni implicitement ni explicitement enARRAY<DATETIME>.STRUCT<a:BIGINT,b:INT>peut être converti implicitement enSTRUCT<col1:STRING,col2:BIGINT>, mais ni implicitement ni explicitement enSTRUCT<a:STRING>.
Conversion implicite et son champ d'application
Une conversion implicite est une opération effectuée automatiquement par MaxCompute à l'exécution, selon le contexte et les règles de conversion. Les tableaux ci-dessous présentent les conversions implicites prises en charge par MaxCompute.
|
De/Vers |
BOOLEAN |
TINYINT |
SMALLINT |
INT |
BIGINT |
FLOAT |
|
BOOLEAN |
N/A |
N |
N |
N |
N |
N |
|
TINYINT |
N |
N/A |
O |
O |
O |
O |
|
SMALLINT |
N |
N |
N/A |
O |
O |
O |
|
INT |
N |
N |
O |
N/A |
O |
O |
|
BIGINT |
N |
N |
N |
N |
N/A |
O |
|
FLOAT |
N |
N |
N |
N |
O |
N/A |
|
De/vers |
DOUBLE |
DECIMAL |
STRING |
VARCHAR |
TIMESTAMP |
BINARY |
|
DOUBLE |
N/A |
O |
O |
O |
N |
N |
|
DECIMAL |
N |
N/A |
O |
O |
N |
N |
|
STRING |
O |
O |
N/A |
O |
N |
N |
|
VARCHAR |
O |
O |
O |
N/A |
N |
N |
|
TIMESTAMP |
N |
N |
O |
O |
N/A |
N |
|
BINARY |
N |
N |
N |
N |
N |
N/A |
Dans ces tableaux, O signifie que la conversion est prise en charge, N qu'elle ne l'est pas, et N/A qu'aucune conversion n'est requise. MaxCompute renvoie une erreur en cas de conversion implicite non prise en charge ou d'échec de conversion à l'exécution.
MaxCompute 2.0 introduit des définitions de constantes pour les types DECIMAL et DATETIME. Par exemple, 100BD est une constante DECIMAL de valeur 100, et
2017-11-11 00:00:00est une constante DATETIME. Vous pouvez utiliser ces constantes directement dans les clauses VALUES et les tables.Comme MaxCompute effectue automatiquement les conversions implicites selon le contexte, il est recommandé d'utiliser CAST pour les conversions explicites lorsque les types de données ne correspondent pas.
Les règles de conversion implicite s'appliquent uniquement dans un périmètre spécifique. Dans certains contextes, seul un sous-ensemble de ces règles est applicable.
Exemple
SELECT user_id+age+'12345', CONCAT(user_name,user_id,age) FROM user;
Les règles de conversion implicite varient selon l'opérateur utilisé :
-
Conversion implicite avec les opérateurs relationnels
Les opérateurs relationnels incluent
=, <>, <, <=, >, >=, IS NULL, IS NOT NULL, LIKE, RLIKE, and IN. Les règles de conversion implicite pourLIKE, RLIKE, and INdiffèrent de celles des autres opérateurs relationnels et sont décrites séparément. Les règles présentées dans cette section ne s'appliquent pas à ces trois opérateurs.Lorsqu'une opération relationnelle implique différents types de données, ceux-ci sont convertis implicitement selon les règles suivantes.
De/vers
BIGINT
DOUBLE
STRING
DATETIME
BOOLEAN
DECIMAL
BIGINT
N/A
DOUBLE
DOUBLE
N
N
DECIMAL
DOUBLE
DOUBLE
N/A
DOUBLE
N
N
DECIMAL
STRING
DOUBLE
DOUBLE
N/A
DATETIME
N
DECIMAL
DATETIME
N
N
DATETIME
N/A
N
N
BOOLEAN
N
N
N
N
N/A
N
DECIMAL
DECIMAL
DECIMAL
DECIMAL
N
N
N/A
RemarqueSi les deux types de données comparés ne peuvent pas être convertis implicitement, l'opération relationnelle échoue et renvoie une erreur.
Pour plus d'informations sur les opérateurs relationnels, consultez Operators.
-
Conversion implicite avec les opérateurs relationnels spéciaux
Les opérateurs relationnels spéciaux incluent
LIKE, RLIKE, and IN.-
La syntaxe pour LIKE et RLIKE est la suivante :
source LIKE pattern; source RLIKE pattern;RemarqueLes paramètres source et pattern pour LIKE et RLIKE doivent être de type STRING.
Les autres types de données ne sont pas autorisés et ne sont pas convertis implicitement en STRING pour cette opération.
-
La syntaxe pour IN est la suivante :
key IN (value1, value2, …)RemarqueDans une expression IN, toutes les valeurs de la liste doivent avoir le même type de données.
Lors de la comparaison de la clé avec les valeurs, si les types incluent BIGINT, DOUBLE et STRING, il est recommandé de tous les convertir en DOUBLE. Si les types incluent DATETIME et STRING, il est recommandé de tous les convertir en DATETIME. Aucune autre conversion de type n'est autorisée.
-
-
Conversion implicite avec les opérateurs arithmétiques
Les opérateurs arithmétiques incluent
+, -, *, /, and %. Leurs règles de conversion implicite sont les suivantes :Seuls les types STRING, BIGINT, DOUBLE et DECIMAL peuvent être utilisés dans les opérations arithmétiques.
Les valeurs STRING sont implicitement converties en DOUBLE avant l'opération.
Le type BIGINT est implicitement converti en DOUBLE lorsqu'il est utilisé dans des calculs avec DOUBLE.
Les types DATETIME et BOOLEAN ne peuvent pas être utilisés dans les opérations arithmétiques.
-
Conversion implicite avec les opérateurs logiques
Les opérateurs logiques incluent
and, or, and not. Leurs règles de conversion implicite sont les suivantes :Seules les valeurs BOOLEAN peuvent être utilisées dans les opérations logiques.
Les autres types de données ne peuvent pas être utilisés dans les opérations logiques et ne peuvent pas être convertis implicitement à cette fin.
Conversion implicite dans les fonctions intégrées
MaxCompute SQL propose un large éventail de fonctions intégrées permettant d'effectuer des calculs sur une ou plusieurs colonnes de n'importe quelle ligne et de renvoyer divers types de données. Leurs règles de conversion implicite sont les suivantes :
Lors de l'appel d'une fonction, si le type de données d'un paramètre d'entrée ne correspond pas au type défini pour ce paramètre, celui-ci est converti implicitement vers le type requis.
Les règles de conversion implicite varient pour chaque fonction intégrée de MaxCompute SQL .
Conversion implicite dans les expressions CASE WHEN
Pour plus d'informations sur les expressions CASE WHEN, consultez CASE WHEN expression. Les règles de conversion implicite sont les suivantes :
Si les types de retour incluent uniquement BIGINT et DOUBLE, tous sont convertis en DOUBLE.
Si l'une des valeurs de retour potentielles est une STRING, toutes les valeurs de retour sont converties en STRING. Si un type, tel que BOOLEAN, ne peut pas être converti, une erreur est renvoyée.
Aucune autre conversion de type n'est autorisée.
Conversion entre STRING et DATETIME
MaxCompute prend en charge les conversions entre les types STRING et DATETIME. Le format yyyy-mm-dd hh:mi:ss est utilisé pour ces conversions.
|
Unité |
Chaîne de format |
Plage de valeurs |
|||
|
Année |
yyyy |
0001-9999 |
|||
|
Mois |
mm |
01-12 |
|||
|
Jour |
dd |
01-28 |
29 |
30 |
31 |
|
Heure |
hh |
00-23 |
|||
|
Minute |
mi |
00-59 |
|||
|
Seconde |
ss |
00-59 |
Si la valeur d'une unité est constituée d'un seul chiffre, le zéro initial ne peut pas être omis. Par exemple,
2014-1-9 12:12:12est un format DATETIME invalide et ne peut pas être converti de STRING en DATETIME. Vous devez l'écrire sous la forme2014-01-09 12:12:12.Une STRING ne peut être convertie en DATETIME que si la chaîne correspond au format décrit ci-dessus. Par exemple,
CAST("2013-12-31 02:34:34" AS DATETIME)convertit la STRING2013-12-31 02:34:34au type DATETIME. De même, lorsqu'une valeur DATETIME est convertie en STRING, elle adopte par défaut le formatyyyy-mm-dd hh:mi:ss.
MaxCompute fournit la fonction TO_DATE, qui permet de convertir des valeurs STRING ne correspondant pas au format de date par défaut vers le type DATETIME. Pour plus d'informations, consultez TO_DATE.