Retour à la liste des articles Articles
7 minutes de lecture

Fonction SQL CAST() : Vue d'ensemble

La fonction SQL CAST() convertit un type de données en un autre. Cet article explique à quoi sert cette fonction, quand et comment l'utiliser.

Dans les bases de données relationnelles, chaque colonne possède un type de données défini qui contrôle le type de données stockées dans la colonne et la manière dont ces données peuvent être utilisées. Par exemple, une description de produit sera probablement stockée sous la forme d'une chaîne de texte, et vous ne pourrez pas l'utiliser à des fins arithmétiques (par exemple pour calculer des totaux).

En revanche, le solde dû par un client sera stocké sous forme de données numériques et pourra être utilisé dans des calculs. SQL dispose d'ensembles de fonctions distincts pour les opérations numériques et pour la manipulation des chaînes de caractères.

Il peut arriver que vous souhaitiez ignorer ces règles et traiter une colonne d'une manière différente des opérations habituelles de son type de données. C'est là que la fonction SQL CAST() devient utile. Elle convertit un élément de données en un type de données différent dans votre requête. Nous verrons plus loin dans cet article quelques exemples de cas où vous pourriez avoir besoin d'utiliser cette fonction.

Si vous souhaitez acquérir une compréhension plus approfondie du langage SQL, consultez notre parcours d'apprentissage SQL de A à Z. Cette série de 7 cours vous emmène du niveau débutant jusqu'aux sujets SQL avancés. Vous acquerrez une expérience pratique en travaillant sur plus de 700 exercices guidés ; en cours de route, vous vous familiariserez avec les concepts des bases de données relationnelles. Tout ce dont vous avez besoin, c'est d'un navigateur et d'une connexion Internet, et de l'aide est disponible à chaque étape.

Syntaxe de la fonction SQL CAST()

La fonction CAST() a la même syntaxe simple dans tous les dialectes SQL :

CAST(value AS type)

  • value peut être n'importe quelle valeur SQL valide. Il peut s'agir d'un nom de colonne, du résultat d'un calcul, du résultat d'une fonction ou d'une valeur littérale.
  • type est le type de données souhaité, c'est-à-dire ce en quoi vous voulez que la valeur soit convertie.

Par exemple, supposons que la colonne date_hired de la table employee a été définie comme un type de données DATE. Vous souhaitez l'alimenter avec la date du jour à l'aide de la fonction GETDATE(), qui renvoie une valeur de type DATETIME.

Vous pouvez convertir la valeur DATETIME en valeur DATE à l'aide de cette syntaxe :

INSERT INTO employee (date_hired)
VALUES (CAST(GETDATE() AS DATE));

CAST() Exemples de fonctions

Voyons quelques exemples de la façon dont CAST() peut être utilisé dans votre travail quotidien.

1) Utilisation de nombres comme chaînes de caractères

Une table nommée employee contient le champ département, qui est défini comme un type de données INT (integer). Les trois premiers chiffres de ce code indiquent la section de l'organisation.

La direction souhaite savoir combien de personnes sont employées dans chaque section. Pour ce faire, nous devons extraire les trois premiers chiffres du département. Nous devons convertir cette valeur INT en une valeur VARCHAR, puis utiliser la fonction string LEFT() pour extraire les trois premiers caractères.

La requête se présente comme suit :

SELECT 
  LEFT(CAST (department AS VARCHAR(15)), 3) AS section, 
  COUNT(*) AS employee_count
FROM employee
GROUP BY LEFT(CAST (department AS VARCHAR(15)), 3)
ORDER BY LEFT(CAST (department AS VARCHAR(15)), 3);

Remarquez que CAST() est intégré à la fonction LEFT() et que les fonctions doivent être répétées dans les clauses GROUP BY et ORDER BY.

2) Jointure de tables sur des colonnes ayant des types de données différents

La table employee de l'exemple précédent doit être jointe à une autre table department_details, dont le champ code est défini comme un VARCHAR. D'ordinaire, la jointure de la colonne département dans employee à la colonne code à la colonne department_details entraînerait une erreur, car les champs ont des types de données différents. Nous savons que le code du département sera toujours numérique, nous pouvons donc contourner le problème en transformant le code en entier.

La requête ressemblerait à ceci :

SELECT department_name, name, date_hired
FROM employee
JOIN department_details 
ON department = CAST(code AS int);

3) Modification des types de champs dans une opération ETL

Un processus de fabrication comporte des capteurs à différents endroits qui génèrent une alarme chaque fois qu'une condition inhabituelle est rencontrée. Ces alarmes sont automatiquement chargées dans une table nommée alarms. Un processus quotidien copie les lignes de alarms dans une table de l'entrepôt nommée alarm_historyqui peut être utilisée à des fins d'analyse. Le tableau alarms est ensuite effacée.

Le tableau alarms se présente comme suit :

clock_time 		varchar(20),
sensor_no 		int,
status_code 	char(2)

Le tableau alarm_history est similaire, mais l'heure doit être stockée sous forme de DATETIME, car les gestionnaires auront besoin de l'extraire et de l'analyser en fonction d'une plage de dates. Elle est définie comme suit :

clock_time 		datetime,
sensor_no 		int,
status_code 	char(2)

La requête qui copie les données dans alarm_history doit convertir le VARCHAR clock_time en un type de données DATETIME. Elle se présente comme suit :

INSERT INTO alarm_history
SELECT 
  CAST(clock_time AS DATETIME),
  sensor_no,
  status_code
FROM alarms;

Quand utiliser CAST()

Examinons quelques scénarios dans lesquels la fonction SQL CAST() peut s'avérer utile.

  • Opérations ETL (Extract, Transform, Load) : L'ETL prend des données d'une ou de plusieurs sources et les transforme dans la forme requise pour une utilisation différente. Par exemple, vous pouvez prendre des données stockées dans un système utilisé pour les opérations quotidiennes d'une entreprise et les charger dans un entrepôt de données adapté à l'analyse marketing. Les types de données de l'entrepôt de données peuvent être différents de ceux du système d'origine, d'où l'importance du site CAST().
  • Utilisation de fonctions appartenant à un type de données différent : Il peut arriver que vous souhaitiez utiliser des fonctions de chaîne de caractères sur des données numériques, par exemple pour formater les données dans un rapport. De même, vous pouvez utiliser des fonctions numériques et des agrégats sur des données de type chaîne (à condition de savoir que la colonne contient des nombres).
  • Joindre des tableaux sur des colonnes ayant des types de données différents : Cette situation ne se produit généralement pas si la base de données a été bien conçue, mais elle peut se produire dans la pratique.
  • Travailler avec des dates stockées sous forme de chaînes de caractères. Les concepteurs de bases de données enregistrent parfois les dates sous forme de chaînes de texte ; ces dates ne peuvent pas être utilisées pour les fonctions et les calculs de date. Vous pouvez contourner ce problème en utilisant CAST().
  • Utilisation de SQL dynamique : Si vous écrivez des programmes ou des procédures stockées, vous pouvez avoir besoin d'incorporer des données dans une chaîne pour construire une requête dynamique.

Si votre requête renvoie une erreur en raison d'une incompatibilité de type de données, la fonction CAST() est probablement la solution à votre problème.

Types de données pris en charge par les dialectes SQL les plus courants

1. le serveur SQL

SQL Server permet d'utiliser n'importe lequel de ses types de données valides comme paramètre de type dans la fonction CAST(). Certaines conversions ne sont pas autorisées lorsque les types de données ne sont pas compatibles. Vous pouvez vérifier quelles conversions sont autorisées dans la documentation T-SQL.

Pour une couverture complète de la fonction CAST() dans SQL Server, voir la documentation de Microsoft sur les fonctions CAST() et CONVERT().

2) MySQL

MySQL n'est pas standard en ce sens qu'il n'utilise pas le type de données pour le paramètre de type. Au lieu de cela, il dispose d'un ensemble fixe de valeurs autorisées :

  • BINARY
  • CHAR (Remarque : ce type est utilisé pour tout type de valeur de chaîne, par exemple VARCHAR ou TEXT. Le moteur de base de données décidera du type de données produit en fonction de la longueur du texte).
  • DATE
  • DATETIME
  • DECIMAL
  • DOUBLE
  • FLOAT
  • JSON
  • NCHAR
  • REAL
  • SIGNED
  • SPACIAL_TYPE
  • UNSIGNED
  • YEAR

Vous trouverez plus d'informations sur CAST() dans le manuel de référence MYSQL.

3) Oracle

Oracle utilise le type de données pour le paramètre type. La documentation contient un tableau des types de données valables pour la conversion.

4) PostgreSQL

PostgreSQL utilise le type de données pour le paramètre type. La documentation de PostgreSQL n'indique pas explicitement quelles sont les conversions autorisées, mais les conversions standard entre les chaînes de caractères, les nombres et les dates sont acceptables.

PostgreSQL vous permet de créer vos propres règles de casting pour les conversions non standard en utilisant la fonction CREATE_CAST.

Que fait-on ensuite avec la fonction SQL CAST() ?

Nous avons eu une introduction complète à la fonction SQL CAST() et à son utilisation. Si vous êtes à la recherche d'un programme d'étude complet qui couvre non seulement les bases mais aussi les sujets avancés - y compris CAST() - je vous recommande une fois de plus notre piste SQL From A to Z. Il regorge de conseils utiles, d'exercices pratiques et d'avis d'experts.

Bonne chance et bon apprentissage !