Le tri et le formatage, c’est logique et super utile. Mais parfois, tu peux vite t’emmêler les pinceaux et obtenir des résultats chelous. On va voir ensemble les erreurs les plus courantes pour que tes données soient toujours nickel et bien rangées !
1. Tri de données de types différents
Imagine : tu tries une table sur une colonne qui mélange des nombres et des chaînes de caractères. PostgreSQL va essayer de t’aider, mais le résultat peut te surprendre. Par exemple, tu as une table où value est du texte :
| id | value |
|---|---|
| 1 | 10 |
| 2 | 2 |
| 3 | apple |
| 4 | 20 |
Et tu écris la requête :
SELECT *
FROM mixed_data
ORDER BY value;
Résultat attendu ? Peut-être : 2, 10, 20, apple ? Nope, PostgreSQL trie les chaînes selon l’ordre alphabétique/lexicographique, donc tu auras : 10, 2, 20, apple.
Comment éviter l’erreur ?
Si tu sais que ta colonne texte contient des nombres, convertis-les explicitement en nombre avant de trier :
SELECT * FROM mixed_data ORDER BY value::INT;
Maintenant, le résultat sera : 2, 10, 20.
Mais fais gaffe : si tu as des chaînes qui ne peuvent pas être converties en nombre, ta requête va planter !
2. Spécifier plusieurs colonnes pour le tri
Une erreur classique : oublier la priorité des colonnes quand tu tries sur plusieurs colonnes. Par exemple, tu veux trier des étudiants par nom de famille puis par âge, mais tu inverses l’ordre :
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 2 | Lin | 20 |
| 3 | Song | 19 |
Ta requête :
-- Tri incorrect
SELECT *
FROM students
ORDER BY age, last_name;
Résultat :
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 3 | Song | 19 |
| 2 | Lin | 20 |
Ici, PostgreSQL trie d’abord par âge, puis par nom de famille. Pas vraiment ce que tu voulais, hein ?
La bonne requête :
SELECT *
FROM students
ORDER BY last_name, age;
Résultat :
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 2 | Lin | 20 |
| 3 | Song | 19 |
Maintenant, le tri se fait d’abord par nom de famille, puis par âge à l’intérieur du même nom. C’est exactement ce qu’on voulait !
3. Tri avec des directions différentes
Parfois, tu veux trier avec des directions différentes pour chaque colonne. Genre, trier des produits par catégorie (croissant), puis par prix (décroissant) dans chaque catégorie. L’erreur, c’est d’oublier de préciser la direction pour la deuxième colonne :
| id | category | price |
|---|---|---|
| 1 | Electronics | 99.99 |
| 2 | Electronics | 199.99 |
| 3 | Furniture | 299.99 |
| 4 | Furniture | 199.99 |
Ta requête :
-- Tri incorrect
SELECT *
FROM products
ORDER BY category, price;
Résultat : les prix dans chaque catégorie sont triés par ordre croissant, alors que tu voulais sûrement l’inverse.
La bonne requête :
SELECT *
FROM products
ORDER BY category ASC, price DESC;
Erreurs de formatage
4. Mauvaise utilisation de CONCAT()
Imaginons que tu veux fusionner le prénom et le nom dans une seule chaîne, mais tu oublies de mettre un espace entre les deux :
| id | first_name | last_name |
|---|---|---|
| 1 | John | Doe |
| 2 | Jane | Smith |
Ta requête :
SELECT
CONCAT(first_name, last_name) AS full_name
FROM employees;
Résultat :
| full_name |
|---|
| JohnDoe |
| JaneSmith |
Comment corriger ?
Ajoute un espace entre le prénom et le nom :
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;
Maintenant, c’est bien plus joli :
| full_name |
|---|
| John Doe |
| Jane Smith |
5. Erreurs avec CAST()
Par exemple, tu veux convertir une date en texte pour l’afficher joliment, mais tu oublies de préciser le format :
| id | event_date |
|---|---|
| 1 | 2023-01-15 |
Ta requête :
-- Conversion incorrecte
SELECT
CAST(event_date AS TEXT)
FROM events;
Résultat : la date sera convertie au format YYYY-MM-DD, ce qui n’est pas toujours top pour tes utilisateurs.
Comment corriger ?
Utilise la fonction TO_CHAR() pour choisir le format :
SELECT
TO_CHAR(event_date, 'DD-MM-YYYY') AS formatted_date
FROM events;
Maintenant, la date s’affiche comme 15-01-2023.
6. Erreurs avec DISTINCT
DISTINCT est super pratique pour choper des valeurs uniques, mais parfois on s’en sert mal. Par exemple, tu veux la liste des prénoms uniques des employés :
SELECT DISTINCT first_name, last_name
FROM employees;
À première vue, la requête a l’air ok, mais si deux employés ont le même prénom et nom, ils seront affichés comme un seul résultat, même si ce sont des personnes différentes.
Exemple de données :
| id | first_name | last_name |
|---|---|---|
| 1 | Alex | Lin |
| 2 | Maria | Chi |
| 3 | Alex | Lin |
Résultat de la requête :
| first_name | last_name |
|---|---|
| Alex | Lin |
| Maria | Chi |
Comment éviter l’erreur ?
Ajoute la clé primaire pour garantir l’unicité :
SELECT DISTINCT ON (id) first_name, last_name
FROM employees;
Résultat de la requête avec DISTINCT ON (id) :
| id | first_name | last_name |
|---|---|---|
| 1 | Alex | Lin |
| 2 | Maria | Chi |
| 3 | Alex | Lin |
Comment éviter les erreurs ?
Travailler avec les données, ça demande d’être attentif aux détails. Pour éviter les erreurs qu’on vient de voir :
Vérifie les types de données : assure-toi que les fonctions que tu utilises supportent bien les types de tes colonnes.
Vérifie l’ordre de tri : sois sûr que les colonnes sont dans le bon ordre. N’oublie pas les directions de tri ASC, DESC.
Teste tes requêtes sur des petits jeux de données : ça aide à repérer les bugs tôt.
N’oublie pas la doc PostgreSQL : elle répondra à toutes tes questions sur les fonctions et leur usage. Voilà le lien : doc officielle PostgreSQL.
Maintenant, t’es prêt à affronter toutes les galères de formatage et de tri ! On continue.
GO TO FULL VERSION