Je me demandais s'il était possible de sélectionner quelque chose qui a plus / moins de x caractères en SQL.
Par exemple, j'ai une table d'employés et je veux afficher tous les noms d'employés qui ont plus de 4 caractères dans leur nom.
Voici un exemple de tableau
ID EmpName Dept
1 Johnny ACC
2 Dan IT
3 Amriel PR
4 Amy HR
AND
déclarationSELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
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):
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 à laEmployeeName
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:
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
, ouLENGTH(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.
la source
Aujourd'hui, j'essayais la même chose dans db2 et utilisé ci-dessous, dans mon cas, j'avais des espaces à la fin des données de la colonne varchar
la source
Si vous rencontrez le même problème lors de l'interrogation d'une base de données DB2, vous devrez utiliser la requête ci-dessous.
la source