Travailler avec NULL, ça arrive dans plein de situations : que ce soit pour gérer des données manquantes dans les rapports, pour filtrer ou trier. Si on devait choisir entre une valeur absente dans une table et un chiffre chelou genre 9999, la plupart préféreraient NULL — ouais, c'est pas toujours pratique, mais au moins c'est honnête. On va mater quelques cas typiques.
Exemple : trier des produits avec des prix manquants
Imaginons qu'on gère une boutique en ligne, et qu'on a une table de produits :
| product_id | name | price |
|---|---|---|
| 1 | Téléphone | 45000 |
| 2 | Ordinateur portable | NULL |
| 3 | Caméra | 25000 |
| 4 | Montre connectée | NULL |
On veut trier les produits par prix, et ceux sans prix (NULL) doivent finir à la fin.
SELECT product_id, name, price
FROM products
ORDER BY price ASC NULLS LAST;
Résultat :
| product_id | name | price |
|---|---|---|
| 3 | Caméra | 25000 |
| 1 | Téléphone | 45000 |
| 2 | Ordinateur portable | NULL |
| 4 | Montre connectée | NULL |
Mate bien la construction clé NULLS LAST. Par défaut, PostgreSQL met les valeurs NULL au début pour ASC, mais avec ce paramètre, on les balance à la fin.
Exemple : filtrer les étudiants sans date de naissance
On a une table d'étudiants, et on veut sélectionner seulement ceux qui n'ont pas de date de naissance renseignée.
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
La requête :
SELECT student_id, name
FROM students
WHERE birth_date IS NULL;
Résultat :
| student_id | name |
|---|---|
| 2 | Anna Song |
| 4 | Maria Chi |
On a bien récupéré les infos des étudiants dont la date de naissance est inconnue.
Exemples d'utilisation de fonctions pour gérer NULL
Exemple : calcul du total en tenant compte des NULL
Dans la table des commandes, on stocke les montants des commandes. Mais parfois, les données sont pas complètes, et il faut considérer que dans ces cas-là, le montant vaut 0.
Exemple de données :
| order_id | customer_name | order_amount |
|---|---|---|
| 1 | Alex | 1200 |
| 2 | Maria | 2500 |
| 3 | Max | NULL |
| 4 | Xena | 3100 |
La requête :
SELECT SUM(COALESCE(order_amount, 0)) AS total_amount
FROM orders;
Résultat :
| total_amount |
|---|
| 6800 |
On utilise COALESCE(order_amount, 0) pour remplacer NULL par 0 avant de faire la somme. Comme ça, pas d'erreur ou de calcul foireux.
Exemple : afficher du texte à la place de NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
Dans le rapport, il faut afficher "Non renseigné" pour toutes les données vides au lieu de NULL.
SELECT
customer_name,
COALESCE(order_amount::TEXT, 'Non renseigné') AS order_status
FROM orders;
Résultat :
| customer_name | order_status |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | Non renseigné |
| Xena | 3100 |
COALESCE() permet d'afficher le texte qu'on veut si la valeur est NULL.
Scénarios plus complexes avec NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
Notre but — trier les commandes pour que celles avec un montant manquant soient au début, puis trier du plus grand au plus petit montant.
SELECT customer_name, order_amount
FROM orders
ORDER BY order_amount DESC NULLS FIRST;
Résultat :
| customer_name | order_amount |
|---|---|
| Max | NULL |
| Xena | 3100 |
| Maria | 2500 |
| Alex | 1200 |
Ici, on a utilisé NULLS FIRST pour mettre les valeurs NULL avant toutes les autres.
Exemple : filtrer des données en remplaçant les valeurs NULL
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
Dans certains rapports, il faut afficher seulement les lignes où la valeur est renseignée ou la remplacer par "Inconnu" si c'est NULL.
SELECT
student_id,
name,
COALESCE(birth_date::TEXT, 'Inconnu') AS birth_date_info
FROM students;
Résultat :
| student_id | name | birth_date_info |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | Inconnu |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | Inconnu |
C'est super utile pour les rapports où il faut montrer que des données sont absentes.
Conseils pratiques
Travailler avec NULL demande d'être attentif. Voilà quelques tips :
- Utilise
IS NULLetCOALESCE()pour vérifier et remplacer les valeurs manquantes. - Souviens-toi que les fonctions d'agrégation ignorent
NULL, saufCOUNT(*). - Pour le tri, pense aux mots-clés
NULLS FIRSTetNULLS LAST. - Dans les rapports, indique toujours comment tu gères
NULL, histoire d'éviter les malentendus avec les collègues.
Ces connaissances vont t'aider non seulement à écrire des requêtes propres, mais aussi à impressionner en entretien. Parce que savoir bosser avec des vraies données, c'est toujours plus cool que juste la théorie !
GO TO FULL VERSION