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 :
SELECT UPPER(titre) AS titre_maj FROM films| 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 :
SELECT titre, UPPER(titre) AS titre_maj FROM films| titre | titre_maj |
|---|---|
| Inception | INCEPTION |
| Le Parrain | LE PARRAIN |
| Pulp Fiction | PULP FICTION |
| Amélie Poulain | AMÉ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 :
SELECT genre, LOWER(genre) AS genre_min FROM films| genre | genre_min |
|---|---|
| SF | sf |
| Drame | drame |
| Crime | crime |
| Comédie | comé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.
SELECT titre, LENGTH(titre) AS nb_caracteres FROM films| titre | nb_caracteres |
|---|---|
| Inception | 9 |
| Le Parrain | 10 |
| Pulp Fiction | 12 |
| Amélie Poulain | 14 |
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 :
SELECT titre || ' — ' || genre AS description FROM films| 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 :
SELECT titre, EXTRACT(YEAR FROM date_sortie) AS annee_sortie FROM films| titre | annee_sortie |
|---|---|
| Inception | 2010 |
| Le Parrain | 1972 |
| Pulp Fiction | 1994 |
| Amélie Poulain | 2001 |
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.
SELECT CAST(annee AS TEXT) || ' / ' || CAST(note AS TEXT) AS annee_note FROM films| 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 :
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.