MaxCompute SQL permet de convertir les valeurs d'un type de données vers un autre. 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 indique 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 d'utilisation et limites
La conversion d'un type DOUBLE en type BIGINT tronque la partie décimale. Par exemple,
CAST(1.6 AS BIGINT) = 1.La conversion d'une STRING au format DOUBLE en BIGINT convertit d'abord la valeur en DOUBLE, puis en BIGINT, ce qui tronque la partie décimale. Par exemple,
CAST("1.6" AS BIGINT) = 1.Vous pouvez convertir une STRING au format BIGINT en DOUBLE. Le résultat comporte 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.Utilisez des fonctions intégrées pour convertir certains types de données qui ne prennent pas en charge la conversion explicite directe. Par exemple, utilisez la fonction
TO_CHARpour convertir une valeur BOOLEAN en STRING. Pour plus d'informations, consultez TO_CHAR. La fonctionTO_DATEpermet également de convertir une valeur STRING en DATETIME. Pour plus d'informations, consultez TO_DATE.Si la plage de valeurs d'un DECIMAL est dépassée, l'opération
CAST STRING TO DECIMALpeut provoquer des problèmes tels qu'une erreur de dépassement de capacité 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, nous recommandons 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 le nombre de champs doit être identique et les champs correspondants doivent être implicitement ou explicitement convertibles. Par exemple :
ARRAY<BIGINT>peut être converti implicitement ou explicitement enARRAY<STRING>.ARRAY<BIGINT>peut être converti explicitement enARRAY<INT>mais ne peut pas être converti 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 ne peut être converti ni implicitement ni explicitement enSTRUCT<a:STRING>.
Conversion implicite et son étendue
Une conversion implicite est une conversion de type que MaxCompute effectue automatiquement au moment de l'exécution, en fonction du contexte et des règles de conversion. Les tableaux suivants 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 indique que la conversion est prise en charge, N indique qu'elle ne l'est pas et N/A signifie qu'aucune conversion n'est nécessaire. MaxCompute renvoie une erreur en cas de conversion implicite non prise en charge ou si la conversion échoue au moment de 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 ayant la 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.Étant donné que MaxCompute effectue automatiquement des conversions implicites en fonction du contexte, nous recommandons 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 une portée spécifique. Dans certaines portées, seul un sous-ensemble de ces règles peut s'appliquer.
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 :
-
Conversion implicite avec les opérateurs relationnels
Les opérateurs relationnels incluent
=, <>, <, <=, >, >=, IS NULL, IS NOT NULL, LIKE, RLIKE et IN. Les règles de conversion implicite pourLIKE, RLIKE et INdiffèrent de celles des autres opérateurs relationnels et sont décrites séparément. Les règles de cette section ne s'appliquent pas à ces trois opérateurs.Lorsque différents types de données interviennent dans une opération relationnelle, ils 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 Opérateurs.
-
Conversion implicite avec les opérateurs relationnels spéciaux
Les opérateurs relationnels spéciaux incluent
LIKE, RLIKE et IN.-
La syntaxe de 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 de 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.
Lorsque la clé est comparée aux valeurs, si les types incluent BIGINT, DOUBLE et STRING, nous recommandons de tous les convertir en DOUBLE. Si les types incluent DATETIME et STRING, nous recommandons 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
+, -, *, / et %. 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.
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 et 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, le paramètre est implicitement converti 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 Expression CASE WHEN. 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 une valeur de retour potentielle 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.
Les autres conversions de type ne sont pas autorisées.
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 au type DATETIME. Pour plus d'informations, consultez TO_DATE.