
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
La fonction SQL ORACLE LOWER prend un seul argument de type chaine de caractère et retourne la même chaine mais en minuscule
SELECT LOWER('Bonjour LE MONDE') FROM DUAL;
LOWER('BONJOURLEMONDE')
-----------------------
bonjour le mondeNous utilisons cette fonction par exemple lorsqu’on veut chercher une valeur mais on ne sait pas si cette valeur est en minuscule ou non. La solution sera de convertir les deux chaines en minuscule
SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY
FROM EMPLOYEES
WHERE LOWER(FIRST_NAME) = LOWER('DAVID');
EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY
------------------- ----------------- ---------------------- -------------------
105 David Austin 4800
151 David Bernstein 9500
165 David Lee 6800
Voir aussi les fonctions UPPER et INITCAP.
Syntaxe de LOWER en SQL Oracle
LOWER(chaine)La fonction LOWER convertit tous les caractères d'une chaîne en minuscules. Elle accepte les types CHAR, VARCHAR2, NCHAR, NVARCHAR2 et CLOB, et renvoie le même type.
| Fonction | Effet | Exemple | Résultat |
|---|---|---|---|
LOWER() | tout en minuscules | LOWER('Cours SQL') | cours sql |
UPPER() | tout en majuscules | UPPER('Cours SQL') | COURS SQL |
INITCAP() | 1re lettre de chaque mot | INITCAP('cours sql') | Cours Sql |
Exemples pratiques
-- Normaliser un email avant insertion
INSERT INTO clients (email) VALUES (LOWER('[email protected]'));
-- -> [email protected]
-- Recherche insensible à la casse
SELECT * FROM clients WHERE LOWER(nom) = LOWER('DupOnt');
-- Générer un identifiant à partir du nom
SELECT LOWER(SUBSTR(prenom,1,1) || nom) AS login FROM employes;
-- Jean Dupont -> jdupont
-- Comparer deux colonnes sans tenir compte de la casse
SELECT * FROM v1 JOIN v2 ON LOWER(v1.code) = LOWER(v2.code);LOWER et les accents
LOWER gère correctement les caractères accentués français : LOWER('ÉTÉ') renvoie 'été'. En revanche il ne supprime pas les accents. Pour comparer « ete » et « été », il faut aussi passer par NLSSORT ou CONVERT :
-- Insensible à la casse ET aux accents
SELECT * FROM clients
WHERE NLSSORT(nom, 'NLS_SORT=FRENCH_AI') = NLSSORT('ete', 'NLS_SORT=FRENCH_AI');Les suffixes NLS_SORT : _CI = insensible à la casse (Case Insensitive), _AI = insensible aux accents et à la casse (Accent Insensitive).
Le piège des performances : LOWER casse vos index
C'est le point le plus important de cette page. Cette requête n'utilisera jamais un index classique sur nom :
SELECT * FROM clients WHERE LOWER(nom) = 'dupont'; -- full table scanParce que la colonne est enveloppée dans une fonction, Oracle ne peut plus se servir de l'index. Deux solutions :
-- Solution 1 : index basé sur une fonction
CREATE INDEX idx_clients_nom_lower ON clients (LOWER(nom));
-- Solution 2 : stocker la donnée déjà normalisée
ALTER TABLE clients ADD nom_norm VARCHAR2(100);
UPDATE clients SET nom_norm = LOWER(nom);
CREATE INDEX idx_clients_nom_norm ON clients (nom_norm);La solution 1 est la plus simple ; la solution 2 est préférable si la valeur normalisée sert souvent.
Erreurs fréquentes
- Oublier LOWER d'un seul côté —
WHERE LOWER(nom) = 'Dupont'ne renvoie jamais rien : la valeur comparée doit être en minuscules elle aussi. - LOWER sur une colonne NULL — renvoie NULL, pas une chaîne vide. Combinez avec
NVLsi nécessaire. - Appliquer LOWER dans un ORDER BY — cela change le tri et empêche l'usage d'un index de tri ; préférez
ORDER BY NLSSORT(nom, 'NLS_SORT=FRENCH_CI').
