Passer au contenu principal
eLearner.app
Module 6 · Leçon 4 sur 424/57 dans le cours~10 min
Leçons du module (4/4)

CAST et conversions de types

SQL est fortement typé : chaque colonne a un type (INTEGER, TEXT, NUMERIC, DATE, TIMESTAMP…), et de nombreuses opérations nécessitent les types pour correspondre. Quand ce n’est pas le cas – ou lorsque vous souhaitez formater une valeur différemment - vous utilisez un cast.

Deux syntaxes équivalentes

SQL
-- SQL standard:
CAST(123 AS TEXT)

-- PostgreSQL shorthand (più comune nella pratica):
123::text

Les deux formes sont identiques. Le raccourci ::type est plus compact et s'enchaîne bien avec d'autres expressions :

SQL
SELECT ordered_at::date AS day,
       (oi.quantity * oi.unit_price)::numeric(10,2) AS total,
       id::text || ' - ' || email AS label
FROM   …;

Casts utiles sur l'ensemble de données

SQL
TIMESTAMPDATE          ordered_at::date
NUMERICINTEGER       price::int           -- tronca!
INTEGERNUMERIC       quantity::numeric    -- per evitare div. intera
INTEGERTEXT          id::text             -- per concatenare con ||
TEXTDATE          '2024-03-05'::date
NUMERICTEXT          price::text          -- per LIKE su numeri

Quand un casting peut échouer

SQL
SELECT 'abc'::int;   -- ERRORE: invalid input syntax for type integer
SELECT '12.5'::int;  -- ERRORE: invalid input syntax for type integer
SELECT 12.5::int;    -- 12   (cast numerico-numerico: arrotonda)

Les casts depuis string → number ou string → date sont les plus risqués : ils génèrent une erreur si la chaîne ne correspond pas exactement à celle attendue formater. En production, sur des données externes, il est préférable de valider d'abord avec TRIM / LOWER / regex.

Caster et COMMANDER PAR

Un cas qui génère des bugs subtils : le tri des nombres stockés sous forme de texte.

SQL
SELECT '2', '10', '1' ORDER BY 1;  -- '1', '10', '2'   (alfabetico!)

Solution : lancer dans ORDER BY :

SQL
SELECT code FROM articles ORDER BY code::int;

Essayez-le

Exercice#sql.m6.l4.e1
Tentatives : 0Chargement…

Pour chaque commande, affichez l'identifiant et le jour (uniquement la partie date de commander_at, de type date). Deux colonnes. Commande par identifiant.

Chargement de l'éditeur…
Afficher l'indice

Le casting TIMESTAMP → DATE supprime l'heure : ordonné_à ::date.

Solution disponible après 3 tentatives

Exercice de révision

Exercice#sql.m6.l4.e2
Tentatives : 0Chargement…

Pour chaque client, affichez une colonne d'étiquette qui concatène l'identifiant et l'e-mail séparés par « - » (par exemple « 1 - alice.rossi@example.com »). Commande par identifiant.

Chargement de l'éditeur…
Afficher l'indice

Le || L'opérateur nécessite des opérandes du même type : convertir l'identifiant en texte est le moyen le plus propre.

Solution disponible après 3 tentatives