Transformer le texte et les dates

Les données brutes ne sortent pas toujours dans le format attendu : un prénom stocké en minuscules, une date dont on n'a besoin que de l'année, deux colonnes à afficher comme une seule. PostgreSQL peut faire ces transformations directement dans le SELECT, sans modifier ce qui est enregistré en base.

Transformer sans modifier

Dans les leçons précédentes, on a sélectionné et filtré des données : on choisissait *quelles lignes* afficher. On peut aussi transformer les valeurs affichées — les mettre en majuscules, calculer leur longueur, les assembler — sans toucher à ce qui est stocké en base. Les modifications n'existent que dans le résultat renvoyé. Voici un premier exemple :

La requête
SELECT UPPER(titre) AS titre_maj FROM films
Résultat · 4 lignes
titre_maj
INCEPTION
LE PARRAIN
PULP FICTION
AMÉLIE POULAIN

La base de données stocke toujours « Inception », « Le Parrain »... La transformation n'a lieu qu'au moment de l'affichage. Cette leçon présente les cinq fonctions les plus utiles pour transformer du texte et des dates.

UPPER et LOWER

UPPER et LOWER transforment la casse d'une valeur texte : tout en majuscules, ou tout en minuscules. On les utilise dans le SELECT, comme n'importe quelle colonne, en ajoutant un alias avec AS pour nommer le résultat. Par exemple, les titres en majuscules :

La requête
SELECT titre, UPPER(titre) AS titre_maj FROM films
Résultat · 4 lignes
titretitre_maj
InceptionINCEPTION
Le ParrainLE PARRAIN
Pulp FictionPULP FICTION
Amélie PoulainAMÉLIE POULAIN

On voit le titre original à gauche et sa version transformée à droite. LOWER s'utilise de la même façon — ici, les genres en minuscules :

La requête
SELECT genre, LOWER(genre) AS genre_min FROM films
Résultat · 4 lignes
genregenre_min
SFsf
Dramedrame
Crimecrime
Comédiecomédie

LOWER et UPPER acceptent n'importe quelle colonne texte — nom, prénom, adresse email, intitulé de poste. Ils n'ont aucun effet sur les chiffres ou les dates.

LENGTH : compter les caractères

LENGTH renvoie le nombre de caractères d'une valeur texte. Utile pour vérifier la longueur d'un champ, filtrer les valeurs trop courtes ou trop longues, ou simplement comprendre comment les données sont distribuées.

La requête
SELECT titre, LENGTH(titre) AS nb_caracteres FROM films
Résultat · 4 lignes
titrenb_caracteres
Inception9
Le Parrain10
Pulp Fiction12
Amélie Poulain14

L'espace compte comme un caractère : « Le Parrain » fait bien 10 caractères (L-e-espace-P-a-r-r-a-i-n). LENGTH compte des caractères, pas des octets — un é compte pour 1, pas pour 2.

Assembler avec ||

Pour assembler plusieurs valeurs texte en une seule, SQL utilise l'opérateur de concaténation ||. On peut enchaîner autant de termes qu'on veut, séparés par ||. Par exemple, un titre suivi de son genre, séparés par un tiret :

La requête
SELECT titre || ' — ' || genre AS description FROM films
Résultat · 4 lignes
description
Inception — SF
Le Parrain — Drame
Pulp Fiction — Crime
Amélie Poulain — Comédie

Le séparateur ' — ' est une chaîne de texte comme une autre — on pourrait écrire ', ', ' / ', ou n'importe quoi. Sans séparateur, titre || genre collerait les deux valeurs directement : « InceptionSF », « Le ParrainDrame » — illisible. Toujours prévoir un séparateur entre les termes.

EXTRACT : extraire une partie de date

Pour extraire une partie d'une date — l'année, le mois ou le jour — SQL propose la fonction EXTRACT. Elle prend deux paramètres : ce qu'on veut extraire (YEAR, MONTH, DAY) et la colonne de type date. La table films dispose d'une colonne date_sortie de ce type. Par exemple, l'année de sortie de chaque film :

La requête
SELECT titre, EXTRACT(YEAR FROM date_sortie) AS annee_sortie FROM films
Résultat · 4 lignes
titreannee_sortie
Inception2010
Le Parrain1972
Pulp Fiction1994
Amélie Poulain2001

EXTRACT(MONTH FROM date_sortie) donnerait 7, 3, 10, 4 — le numéro du mois de sortie. EXTRACT(DAY FROM date_sortie) donnerait 16, 15, 14, 25 — le jour. La logique est identique : on change simplement YEAR par le mot qui désigne la partie voulue.

CAST : convertir le type

En base de données, chaque colonne stocke un seul type de valeur : les nombres entiers (INTEGER), les décimaux (NUMERIC), le texte (TEXT) et les dates ne se mélangent pas directement — ce sont des catégories distinctes pour PostgreSQL.

L'opérateur || est défini pour le texte. Quand un côté est déjà du texte, PostgreSQL convertit l'autre côté implicitement — c'est pourquoi titre || ' — ' || genre fonctionne sans problème. Mais si on essaie d'assembler deux colonnes toutes les deux non-texte — par exemple annee || note (un entier et un décimal) — aucun opérateur || n'existe pour integer || numeric, et PostgreSQL retourne une erreur. C'est là que CAST entre en jeu : il convertit explicitement une valeur d'un type vers un autre. La règle : dès que ni l'un ni l'autre opérande n'est du texte, on les convertit tous les deux.

La requête
SELECT CAST(annee AS TEXT) || ' / ' || CAST(note AS TEXT) AS annee_note FROM films
Résultat · 4 lignes
annee_note
2010 / 8.8
1972 / 9.2
1994 / 8.9
2001 / 8.3

La syntaxe : CAST(valeur AS type). Ici, CAST(annee AS TEXT) transforme l'entier 2010 en la chaîne '2010', et CAST(note AS TEXT) fait de même avec 8.8. Une fois les deux en texte, || assemble librement. CAST peut aussi convertir dans l'autre sens : CAST('2010' AS INTEGER) transforme une chaîne en nombre — utile quand des chiffres ont été stockés comme du texte dans une base mal conçue.

Récapitulatif

En résumé, pour transformer des valeurs dans le résultat :

📌 Transformer — les cinq fonctions
UPPER(col) / LOWER(col)→ majuscules / minuscules
LENGTH(col)→ nombre de caractères
col1 || ' sep ' || col2→ assembler des textes
EXTRACT(YEAR/MONTH/DAY FROM col_date)→ extraire une partie de date
CAST(col AS type)→ convertir le type (TEXT, INTEGER…)
Exemple complet
SELECT CAST(annee AS TEXT) || ' / ' || CAST(note AS TEXT) AS annee_note FROM films

💡 Bon à savoir : PostgreSQL propose aussi la notation :: pour la conversion de type — annee::TEXT est identique à CAST(annee AS TEXT), juste plus court à écrire. Tu la rencontreras souvent dans des requêtes réelles.

Passe à la pratique

Cette leçon t'a montré la théorie. Pour maîtriser SQL, rien ne vaut la pratique : accède aux exercices et au bac à sable PostgreSQL réel.

← Tous les cours SQL