CodeGym /Cours /SQL SELF /Comparaison et conversion des types de données

Comparaison et conversion des types de données

SQL SELF
Niveau 16 , Leçon 3
Disponible

Pourquoi on se prend la tête avec la comparaison et la conversion des types ? Imagine, t’as une chaîne "42" dans ta table, et tu veux la comparer avec le nombre 42. À première vue, c’est pareil. Mais pour la base de données, c’est pas du tout la même chose. PostgreSQL va pas deviner tout seul ce que tu veux dire. Et si tu piges pas comment il compare les valeurs de types différents, tu risques d’avoir des résultats bizarres ou carrément une erreur.

Pareil pour les conversions. Parfois, tu dois transformer du texte en nombre pour compter combien t’as de trucs. Et parfois, c’est l’inverse — tu veux afficher un nombre joliment comme une chaîne. Ou alors tu veux prendre une date et la montrer comme "01.01.2025", parce que c’est plus parlant pour l’utilisateur.

Encore un exemple : t’as une valeur précise stockée en NUMERIC, mais pour des calculs scientifiques tu dois utiliser FLOAT. Dans ces cas-là, tu peux pas t’en sortir sans conversion explicite.

La bonne nouvelle, c’est que PostgreSQL gère ça super bien. Il te file des outils flexibles et clairs pour ce genre de trucs. Le principal, c’est de savoir comment t’en servir, et pas avoir peur de regarder un peu sous le capot. C’est ce qu’on va faire ici.

Comparaison des types de données

PostgreSQL essaie d’être malin — si tu compares, par exemple, INTEGER et NUMERIC, il va les ramener au même type et comparer tranquille. C’est normal, vu que les deux sont des nombres.

Mais si tu tentes de comparer une chaîne avec un booléen (TEXT et BOOLEAN), la base va rien comprendre à ce que tu veux. Ces types n’ont rien à voir, et PostgreSQL va juste te balancer une erreur. Pareil si tu compares la chaîne "42" avec le nombre 42 sans préciser que tu veux convertir la chaîne en nombre.

En pratique, ça donne quoi ? Voici un exemple qui va planter :

SELECT '42' = 42; -- Erreur ! Chaîne et nombre ne se comparent pas sans conversion

Mais comme ça, ça marche nickel :

SELECT '42'::INTEGER = 42; -- TRUE

Là, on dit clairement : “S’il te plaît, commence par convertir '42' en nombre”. C’est pour ça qu’on a le syntaxe ::Type, dont on a déjà parlé. PostgreSQL aime quand on lui parle clairement.

Comparaison des types numériques

Les types numériques (INTEGER, NUMERIC, REAL) sont souvent compatibles entre eux, donc tu peux les comparer sans trop de prise de tête :

SELECT 42 = 42.0; -- TRUE
SELECT 42::REAL = 42.0; -- TRUE
SELECT 42.0::NUMERIC = 42; -- TRUE

Mais fais gaffe avec les nombres à virgule flottante (REAL). À cause de la précision limitée, ils peuvent avoir des comportements chelous. Par exemple :

SELECT 0.1 + 0.2 = 0.3; -- FALSE

C’est pas la devinette la plus connue en prog, ça ? Ici, la comparaison renvoie FALSE à cause de la façon dont les nombres à virgule sont stockés en mémoire.

Comparaison des types texte

Quand tu bosses avec des types texte, tu peux comparer CHAR, VARCHAR et TEXT, car PostgreSQL les convertit automatiquement en types compatibles :

SELECT 'Hello' = 'Hello'::TEXT; -- TRUE
SELECT 'World'::CHAR(5) = 'World'::VARCHAR; -- TRUE

Fais gaffe à la longueur dans CHAR(n) : si la chaîne est plus courte que la longueur indiquée, PostgreSQL va la compléter avec des espaces.

Conversion des types de données

PostgreSQL propose plusieurs façons de convertir les types de données. On va voir les deux méthodes principales :

Méthode n°1 : Conversion explicite (CAST)

L’opérateur CAST te permet de dire comment convertir un type en un autre. Exemple :

SELECT CAST('42' AS INTEGER); -- Convertit la chaîne '42' en nombre 42

Cette méthode est surtout pratique si tu veux rendre ton code SQL plus lisible.

Méthode n°2 : Syntaxe raccourcie (::)

PostgreSQL propose une autre syntaxe pour convertir les types — utiliser ::. C’est la même opération, mais en plus court :

SELECT '42'::INTEGER; -- Pareil que CAST('42' AS INTEGER)

Conversion automatique

Dans pas mal de cas, PostgreSQL convertit les données tout seul. Par exemple, utiliser des nombres dans des champs texte :

SELECT '42' = 42::TEXT; -- TRUE

Mais faut pas trop compter sur la conversion automatique, car ça peut surprendre d’autres devs. Par exemple, pour les dates et les chaînes, mieux vaut convertir explicitement.

Exemples de conversion de différents types de données

Conversion de nombres en texte

Parfois, tu dois convertir des nombres en texte (genre pour afficher des messages) :

SELECT 42::TEXT; -- Convertit le nombre 42 en chaîne '42'
SELECT 3.14::TEXT; -- Convertit le nombre 3.14 en chaîne '3.14'

Conversion de texte en nombres

Si la chaîne contient un nombre valide, tu peux la convertir en type numérique :

SELECT '123'::INTEGER; -- Convertit la chaîne '123' en nombre 123
SELECT '3.14'::FLOAT;  -- Convertit la chaîne '3.14' en nombre 3.14

Mais si le texte ne peut pas être converti ? Par exemple :

SELECT 'Hello'::INTEGER; -- Erreur : impossible de convertir 'Hello' en nombre

Pour éviter ce genre d’erreur, tu peux utiliser la fonction TRY_CAST() (à partir de PostgreSQL 14) ou vérifier les données avant.

Conversion de date en texte et inversement

Pour convertir des dates, tu peux utiliser les fonctions TO_CHAR() et TO_DATE() :

SELECT TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD'); -- Convertit la date en chaîne
SELECT TO_DATE('2023-10-25', 'YYYY-MM-DD'); -- Convertit la chaîne en date

Conversion entre BOOLEAN et texte

Le type booléen BOOLEAN peut aussi être converti en chaîne :

SELECT TRUE::TEXT; -- 'true'
SELECT FALSE::TEXT; -- 'false'

Ou l’inverse :

SELECT 'true'::BOOLEAN; -- TRUE
SELECT 'false'::BOOLEAN; -- FALSE

Attention, les chaînes comme 'yes' ou 'no' ne seront pas converties automatiquement.

Pratique : tout sur des exemples concrets

Créons une table qui montre l’utilisation de différents types de données :

id number_as_text - TEXT number_as_integer - INTEGER date_as_text - TEXT actual_date - DATE
1 42 42 2023-10-25 2023-10-25
2 3.14 NULL 2023-10-24 NULL
3 Hello 123 NULL NULL

Maintenant, on va faire des opérations de conversion :

-- Conversion de texte en nombre
SELECT number_as_text::INTEGER FROM data_types_demo WHERE number_as_text = '42';

-- Conversion de date en texte
SELECT TO_CHAR(actual_date, 'DD/MM/YYYY') FROM data_types_demo;

-- Conversion de chaîne en date
SELECT TO_DATE(date_as_text, 'YYYY-MM-DD') FROM data_types_demo;

Erreurs fréquentes lors de la conversion des données

Les erreurs classiques incluent :

  1. Essayer de convertir des données qui ne correspondent pas au format attendu (par exemple, la chaîne 'Hello' en INTEGER).
  2. Problèmes d’arrondi et de précision avec les nombres à virgule flottante.
  3. Mauvaise utilisation des formats lors de la conversion des dates.

Pour éviter les erreurs, il vaut mieux :

  • Toujours vérifier les données avant de convertir.
  • Utiliser les fonctions de gestion d’erreur (TRY_CAST ou CASE).
  • Indiquer le format explicitement lors de la conversion des dates.
-- Vérification des données avant conversion
SELECT 
    CASE 
        WHEN number_as_text ~ '^\d+$' THEN number_as_text::INTEGER
        ELSE NULL
    END AS safe_integer
FROM data_types_demo;

Utilise cette approche pour protéger tes requêtes des situations cheloues !

À ce stade, t’as les bases pour comparer et convertir les types de données dans PostgreSQL. Il ne reste plus qu’à pratiquer, pratiquer et encore pratiquer. À la prochaine dans les prochaines lectures !

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION