SQL Pratique
Fonctions SQL de texte : guide pratique complet
8 min de lecture

Fonctions SQL de texte : guide pratique complet

Maîtrisez les fonctions SQL de manipulation de texte : UPPER, LOWER, TRIM, SUBSTRING, CONCAT et bien d'autres. Exemples concrets et exercices.

Avatar de Thomas LeroyThomas Leroy

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, LOWER et CONCAT couvrent 80 % des besoins courants de nettoyage
  • SUBSTRING et POSITION permettent d'extraire des parties précises d'une chaîne
  • Combiner ces fonctions avec CASE WHEN ou WHERE dé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

Cas pratique : nettoyage d'une table clients

Imaginez une table clients avec des données saisies manuellement. Les noms sont en casse mixte, les e-mails ont des espaces, les numéros de téléphone incluent des tirets. Une seule requête peut tout normaliser :

SELECT
  UPPER(TRIM(nom))                                AS nom_normalise,
  LOWER(TRIM(email))                              AS email_normalise,
  REPLACE(REPLACE(telephone, '-', ''), ' ', '')   AS telephone_propre,
  LEFT(code_postal, 5)                            AS cp_5_chiffres
FROM clients;

Ce type de requête de nettoyage est exactement ce que les recruteurs attendent lors d'un test technique SQL. Il démontre votre capacité à traiter des données réelles, pas seulement des exemples académiques.

Questions fréquentes

Quelle est la différence entre SUBSTR et SUBSTRING ?

SUBSTRING est la syntaxe standard SQL supportée par la plupart des SGBD modernes. SUBSTR est un alias utilisé notamment dans Oracle et SQLite. Les deux fonctionnent de la même manière ; SUBSTRING est à préférer pour la portabilité.

Comment comparer des chaînes sans tenir compte de la casse ?

Utilisez LOWER ou UPPER sur les deux membres de la comparaison : WHERE LOWER(email) = LOWER('User@Example.com'). Sur PostgreSQL, l'opérateur ILIKE permet une comparaison insensible à la casse directement dans le WHERE.

CONCAT ignore-t-il vraiment les NULL ?

Oui, dans MySQL et SQL Server, CONCAT traite les NULL comme des chaînes vides. Dans PostgreSQL, CONCAT fait de même. Mais l'opérateur || propage le NULL : 'hello' || NULL retourne NULL. Utilisez COALESCE(champ, '') pour sécuriser vos requêtes.

Comment extraire le domaine d'une adresse e-mail en SQL ?

Combinez SUBSTRING et POSITION :

SELECT SUBSTRING(email, POSITION('@' IN email) + 1) AS domaine
FROM utilisateurs;

Cette requête extrait tout ce qui suit le @, y compris le TLD.

Les fonctions texte sont-elles lentes sur de grandes tables ?

Oui, appliquer une fonction sur une colonne indexée dans un WHERE rend l'index inutilisable. Par exemple, WHERE LOWER(email) = 'test@test.com' ne pourra pas utiliser l'index sur email. Sur PostgreSQL, créez un index fonctionnel : CREATE INDEX idx_email_lower ON users (LOWER(email)).

Conclusion

Les fonctions SQL de manipulation de texte sont un pilier de la préparation aux entretiens data. TRIM, UPPER, SUBSTRING, REPLACE et CONCAT couvrent la grande majorité des besoins rencontrés en production. Connaître leurs nuances selon le SGBD cible vous démarquera des autres candidats.

La clé est de les combiner intelligemment : une seule requête bien construite peut nettoyer, normaliser et transformer une colonne entière en quelques lignes. Entraînez-vous sur des cas réels pour ancrer ces réflexes avant votre prochain entretien.

👉 Prêt à tester vos compétences ? Accédez aux exercices SQL pratiques sur SQL Pratique et mettez ces fonctions en pratique dans notre environnement d'exécution en ligne.

Prêt à vous entraîner ?

50 exercices SQL interactifs avec éditeur en ligne, chronomètre et feedback IA.

Voir les exercices