Les fonctions SQL de manipulation de texte sont omniprésentes dans les entretiens techniques data analyst. Dès qu'une table contient des noms, des adresses e-mail ou des codes produits, vous devez savoir nettoyer, découper et reformater ces chaînes efficacement. Maîtriser ces fonctions vous permet de transformer des données brutes en informations exploitables sans passer par Python ou Excel.
Ce guide couvre les fonctions les plus utilisées en production et en entretien : de la simple mise en majuscules à l'extraction de sous-chaînes complexes. Chaque fonction est accompagnée d'exemples concrets que vous pouvez exécuter directement.
📌 Ce qu'il faut retenir
- Les fonctions de texte SQL varient légèrement selon le SGBD (PostgreSQL, MySQL, SQL Server)
TRIM,UPPER,LOWERetCONCATcouvrent 80 % des besoins courants de nettoyageSUBSTRINGetPOSITIONpermettent d'extraire des parties précises d'une chaîne- Combiner ces fonctions avec
CASE WHENouWHEREdécuple leur puissance
Pourquoi les fonctions texte sont incontournables en entretien
Les recruteurs incluent systématiquement des questions sur la manipulation de chaînes dans leurs tests techniques. La raison est simple : les données réelles sont rarement propres. Un champ email peut contenir des espaces parasites, un champ nom peut mélanger majuscules et minuscules, un identifiant peut encoder plusieurs informations dans une seule colonne.
Lors d'un test technique, savoir extraire le domaine d'une adresse e-mail ou normaliser un nom de famille en une seule requête fait la différence. Si vous préparez un entretien SQL complet, ces fonctions apparaissent presque à coup sûr.
Les fonctions de base : nettoyer et normaliser
UPPER, LOWER et INITCAP
Ces 3 fonctions modifient la casse d'une chaîne. Elles sont idéales pour normaliser des données avant une comparaison ou un affichage.
SELECT
UPPER('bonjour monde'), -- 'BONJOUR MONDE'
LOWER('BONJOUR MONDE'), -- 'bonjour monde'
INITCAP('bonjour monde') -- 'Bonjour Monde' (PostgreSQL)
FROM dual;
INITCAP n'existe que dans PostgreSQL et Oracle. Sur MySQL ou SQL Server, vous devrez combiner UPPER et SUBSTRING pour obtenir le même résultat.
TRIM, LTRIM et RTRIM
Les espaces invisibles en début ou fin de chaîne causent des bugs silencieux difficiles à détecter. TRIM supprime ces espaces des deux côtés, LTRIM uniquement à gauche, RTRIM uniquement à droite.
SELECT TRIM(' données propres ');
-- Résultat : 'données propres'
Vous pouvez aussi supprimer un caractère spécifique avec TRIM(BOTH 'x' FROM colonne) dans PostgreSQL. Cette syntaxe est utile pour nettoyer des codes encadrés par des guillemets ou des tirets.
💡 Bon à savoir
Appliquez toujours TRIM avant une comparaison dans un WHERE. Un espace invisible rend deux chaînes identiques à l'œil inégales pour SQL, ce qui génère des résultats faux sans message d'erreur.
LENGTH et CHAR_LENGTH
LENGTH retourne le nombre de caractères d'une chaîne. Attention : sur MySQL, LENGTH compte les octets (différent pour les caractères accentués), tandis que CHAR_LENGTH compte les caractères réels.
SELECT
LENGTH('café'), -- 5 sur MySQL (encodage UTF-8)
CHAR_LENGTH('café') -- 4 sur MySQL
FROM dual;
Sur PostgreSQL, LENGTH compte toujours les caractères, quelle que soit l'encodage.
Extraire et découper des chaînes
SUBSTRING : l'extraction chirurgicale
SUBSTRING extrait une portion d'une chaîne à partir d'une position donnée, sur un nombre de caractères défini.
-- Syntaxe standard SQL
SELECT SUBSTRING('SQL Pratique', 5, 8);
-- Résultat : 'Pratique'
La position commence à 1 (et non à 0). Une erreur classique en entretien consiste à utiliser 0 comme index de départ, ce qui donne un résultat incorrect sur certains SGBD.
POSITION et CHARINDEX : trouver un caractère
POSITION (standard SQL / PostgreSQL) et CHARINDEX (SQL Server) localisent la première occurrence d'une sous-chaîne dans une chaîne.
SELECT POSITION('@' IN 'user@example.com');
-- Résultat : 5
Combinée avec SUBSTRING, cette fonction permet d'extraire le nom d'utilisateur d'une adresse e-mail :
SELECT SUBSTRING(email, 1, POSITION('@' IN email) - 1) AS username
FROM utilisateurs;
Ce type de requête revient fréquemment dans les exercices de fonctions fenêtre et manipulation de données lors des entretiens de niveau intermédiaire.
LEFT, RIGHT et MID
Ces fonctions raccourcissent le code pour les cas simples. LEFT(chaine, n) extrait les n premiers caractères, RIGHT(chaine, n) les n derniers.
SELECT
LEFT('AB-2024-XZ', 2), -- 'AB'
RIGHT('AB-2024-XZ', 2), -- 'XZ'
SUBSTRING('AB-2024-XZ', 4, 4) -- '2024'
FROM dual;
MID est un alias MySQL de SUBSTRING. Il n'existe pas dans PostgreSQL ou SQL Server.
Concaténer et remplacer du texte
CONCAT et l'opérateur ||
CONCAT assemble plusieurs chaînes en une seule. L'opérateur || (double pipe) est la syntaxe standard SQL, disponible dans PostgreSQL et Oracle.
SELECT CONCAT(prenom, ' ', nom) AS nom_complet
FROM employes;
-- Équivalent PostgreSQL / Oracle
SELECT prenom || ' ' || nom AS nom_complet
FROM employes;
MySQL et SQL Server supportent les deux syntaxes, mais préfèrent CONCAT. Notez que CONCAT ignore les NULL (retourne la chaîne sans le NULL), contrairement à || qui propage le NULL.
⚠️ Attention
Avec l'opérateur ||, si l'une des chaînes est NULL, le résultat entier est NULL. Utilisez COALESCE pour protéger vos concaténations : COALESCE(champ, '') permet de remplacer NULL par une chaîne vide.
REPLACE : substitution dans une chaîne
REPLACE remplace toutes les occurrences d'une sous-chaîne par une autre.
SELECT REPLACE('2024/07/21', '/', '-');
-- Résultat : '2024-07-21'
C'est la fonction de choix pour normaliser des séparateurs dans des dates stockées comme texte ou pour retirer des caractères indésirables en masse.
REGEXP_REPLACE : le remplacement avancé
Pour les cas plus complexes, REGEXP_REPLACE utilise des expressions régulières. Elle est disponible dans PostgreSQL, Oracle et MySQL 8+.
-- Supprimer tous les chiffres d'une chaîne
SELECT REGEXP_REPLACE('A1B2C3', '[0-9]', '');
-- Résultat : 'ABC'
Tableau comparatif des fonctions selon le SGBD
| Fonction | PostgreSQL | MySQL | SQL Server | Oracle |
|---|---|---|---|---|
| Mise en majuscules | UPPER | UPPER | UPPER | UPPER |
| Première lettre majuscule | INITCAP | Non natif | Non natif | INITCAP |
| Extraction de sous-chaîne | SUBSTRING | SUBSTRING / MID | SUBSTRING | SUBSTR |
| Position d'un caractère | POSITION | LOCATE / POSITION | CHARINDEX | INSTR |
| Longueur de chaîne | LENGTH | CHAR_LENGTH | LEN | LENGTH |
| Concaténation | CONCAT / || | CONCAT | CONCAT / + | CONCAT / || |
| Remplacement regex | REGEXP_REPLACE | REGEXP_REPLACE (8+) | Non natif | REGEXP_REPLACE |
