Imagine que tu veux additionner deux nombres, mais qu’un des paramètres est stocké comme une chaîne de caractères. Ou alors, tu veux filtrer des données par année, mais la date est stockée au format complet avec l’heure. PostgreSQL risque de ne pas trop kiffer ton idée, et tu vas devoir intervenir pour convertir les données dans le bon type.
La conversion de types aide à :
- Simplifier le traitement des données pour pouvoir les utiliser dans des calculs.
- Créer des données plus lisibles et structurées pour l’export ou l’analyse.
- Éliminer les bugs liés aux incompatibilités de types de données.
Bases de la conversion de types de données : CAST() et ::
1. CAST() — le grand frère de toute conversion
La fonction CAST(), c’est la façon "officielle" de convertir une valeur d’un type de données à un autre. Elle fait office de traducteur universel.
Syntaxe :
CAST(valeur AS type_de_donnée_cible)
Exemple 1 : Conversion d’une chaîne en nombre.
SELECT CAST('123' AS INTEGER); -- Résultat : 123
Exemple 2 : Conversion d’un nombre en chaîne.
SELECT CAST(123 AS TEXT); -- Résultat : '123'
Exemple 3 : Conversion d’une date en chaîne.
SELECT CAST(NOW() AS TEXT); -- Résultat : '2023-10-25 15:00:00.000000'
2. L’opérateur :: — une alternative concise
Si CAST() te semble un peu trop verbeux, PostgreSQL propose la syntaxe ::. C’est une façon raccourcie de convertir, super populaire parce qu’elle est rapide à écrire.
Syntaxe :
valeur::type_de_donnée_cible
Exemple 1 : Conversion d’une chaîne en nombre.
SELECT '123'::INTEGER; -- Résultat : 123
Exemple 2 : Conversion d’un nombre en chaîne.
SELECT 123::TEXT; -- Résultat : '123'
Exemple 3 : Conversion d’une date en chaîne.
SELECT NOW()::TEXT; -- Résultat : '2023-10-25 15:00:00.000000'
Exemples concrets d’utilisation de la conversion de types
1. Conversion de nombres et de chaînes
Imaginons que tu as une table students où la colonne student_id est stockée comme une chaîne, mais tu veux la comparer à une valeur numérique. Sans conversion, ça ne marchera pas.
| student_id | first_name | last_name | birth_date | grade |
|---|---|---|---|---|
| 101 | Alex | Lin | 2008-03-15 | 9 |
| 102 | Maria | Chi | 2009-07-22 | 8 |
| 103 | Axel | Ivy | 2007-11-30 | 10 |
| 104 | Nat | Sok | 2008-01-18 | 9 |
| 105 | Pol | Frez | 2009-05-05 | 8 |
Du coup, dans la requête il faut convertir explicitement la colonne student_id en nombre :
SELECT *
FROM students
WHERE student_id::INTEGER = 101;
Même requête avec CAST() :
SELECT *
FROM students
WHERE CAST(student_id AS INTEGER) = 101;
Conversion de dates
Quand tu veux extraire une partie de la date ou la convertir en chaîne, la conversion de types est aussi super utile. Par exemple, tu as une table courses avec les dates de début des cours dans la colonne start_date.
| course_id | course_name | start_date |
|---|---|---|
| 1 | Introduction à Python | 2025-01-15 |
| 2 | Bases de SQL | 2025-03-01 |
| 3 | Analyse de données | 2025-05-10 |
| 4 | Développement web | 2025-06-20 |
| 5 | Machine learning | 2025-09-05 |
Exemple : Extraire l’année sous forme de nombre.
SELECT start_date::DATE, start_date::TEXT, start_date::TIMESTAMP
FROM courses;
Le résultat sera alors :
| start_date (DATE) | start_date (TEXT) | start_date (TIMESTAMP) |
|---|---|---|
| 2025-01-15 | 2025-01-15 | 2025-01-15 00:00:00 |
| 2025-03-01 | 2025-03-01 | 2025-03-01 00:00:00 |
| 2025-05-10 | 2025-05-10 | 2025-05-10 00:00:00 |
| 2025-06-20 | 2025-06-20 | 2025-06-20 00:00:00 |
| 2025-09-05 | 2025-09-05 | 2025-09-05 00:00:00 |
Exemple : Convertir une date en "chaîne pure".
SELECT TO_CHAR(start_date, 'DD-MM-YYYY')
Le résultat sera alors :
| to_char |
|---|
| 15-01-2025 |
| 01-03-2025 |
| 10-05-2025 |
| 20-06-2025 |
| 05-09-2025 |
Erreur : Quand la conversion casse tout ?
Le coup de la conversion de données ne marche pas toujours. Parfois, PostgreSQL te fait bien comprendre qu’il "ne pige pas" ce que tu veux faire. Exemple classique : tu essaies de convertir un texte qui ressemble à un nombre, mais il y a des caractères en trop dans la chaîne.
Exemple d’erreur :
SELECT '123abc'::INTEGER;
-- ERREUR : syntaxe d’entrée invalide pour le type integer : "123abc"
Pour éviter ce genre de souci, assure-toi que les données peuvent vraiment être converties dans le type cible à l’avance. Par exemple, tu peux utiliser des expressions régulières ou des vérifications supplémentaires.
GO TO FULL VERSION