Sélectionnez quelque chose qui a plus / moins de x caractères

109

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
MNX1024
la source

Réponses:

181

Si vous utilisez SQL Server, utilisez la fonction LEN(Longueur):

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4

MSDN pour cela déclare:

Renvoie le nombre de caractères de l'expression de chaîne spécifiée, à l'
exclusion des blancs de fin.

Voici le lien vers le MSDN

Pour oracle / plsql que vous pouvez utiliser Length(), mysql utilise également Length.

Voici la documentation Oracle:

http://www.techonthenet.com/oracle/functions/length.php

Et voici la documentation mySQL de Length(string):

http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_length

Pour PostgreSQL, vous pouvez utiliser length(string)ou char_length(string). Voici la documentation PostgreSQL:

http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-SQL

JonH
la source
1
Pour les inégalités composées, ajoutez simplement une ANDdéclaration SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
alexanderjsingleton
28

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 LENGTHfonction à la EmployeeNamecolonne). 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.

Luis Casillas
la source
5

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

SELECT EmployeeName FROM EmployeeTable WHERE LENGTH (TRIM (EmployeeName))> 4;

Vipin
la source
0

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.

SELECT * 
FROM OPENQUERY(LINK_DB,'SELECT
CITY,
cast(STATE as varchar(40)) 
FROM DATABASE')
Jelani
la source