JonH a très bien couvert la partie sur la façon d'écrire la requête. Il y a cependant un autre problème important qui doit être mentionné, à savoir les caractéristiques de performance d'une telle requête. Répétons-le ici (adapté à Oracle):
SELECT EmployeeName FROM EmployeeTable WHERE LENGTH(EmployeeName) > 4;
Cette requête limite le résultat d'une fonction appliquée à une valeur de colonne (le résultat de l'application de la LENGTH
fonction à la EmployeeName
colonne). Dans Oracle, et probablement dans tous les autres SGBDR, cela signifie qu'un index régulier sur EmployeeName sera inutile pour répondre à cette requête; la base de données effectuera une analyse complète de la table, ce qui peut être très coûteux.
Cependant, diverses bases de données offrent une fonctionnalité d'index de fonction conçue pour accélérer les requêtes comme celle-ci. Par exemple, dans Oracle, vous pouvez créer un index comme celui-ci:
CREATE INDEX EmployeeTable_EmployeeName_Length ON EmployeeTable(LENGTH(EmployeeName));
Cependant, cela peut ne pas vous aider dans votre cas, car l'indice peut ne pas être très sélectif pour votre état. J'entends par là ce qui suit: vous demandez des lignes dont la longueur du nom est supérieure à 4. Supposons que 80% des noms d'employés dans cette table sont plus longs que 4. Eh bien, la base de données va probablement conclure ( correctement) que cela ne vaut pas la peine d'utiliser l'index, car il va probablement devoir lire la plupart des blocs de la table de toute façon.
Cependant, si vous modifiez la requête pour dire LENGTH(EmployeeName) <= 4
, ou LENGTH(EmployeeName) > 35
, en supposant que très peu d'employés ont des noms avec moins de 5 caractères ou plus de 35, alors l'index est sélectionné et améliore les performances.
Quoi qu'il en soit, en bref: méfiez-vous des caractéristiques de performance des requêtes comme celle que vous essayez d'écrire.
AND
déclarationSELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;