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 standard:
CAST(123 AS TEXT)
-- PostgreSQL shorthand (più comune nella pratica):
123::textLes deux formes sont identiques. Le raccourci ::type est plus compact et
s'enchaîne bien avec d'autres expressions :
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
TIMESTAMP → DATE ordered_at::date
NUMERIC → INTEGER price::int -- tronca!
INTEGER → NUMERIC quantity::numeric -- per evitare div. intera
INTEGER → TEXT id::text -- per concatenare con ||
TEXT → DATE '2024-03-05'::date
NUMERIC → TEXT price::text -- per LIKE su numeriQuand un casting peut échouer
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.
SELECT '2', '10', '1' ORDER BY 1; -- '1', '10', '2' (alfabetico!)Solution : lancer dans ORDER BY :
SELECT code FROM articles ORDER BY code::int;Essayez-le
Pour chaque commande, affichez l'identifiant et le jour (uniquement la partie date de commander_at, de type date). Deux colonnes. Commande par identifiant.
Afficher l'indice
Le casting TIMESTAMP → DATE supprime l'heure : ordonné_à ::date.
Solution disponible après 3 tentatives
Exercice de révision
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.
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