Seleccione algo que tenga más / menos que x carácter

109

Me preguntaba si es posible seleccionar algo que tenga más / menos de x caracteres en SQL.

Por ejemplo, tengo una tabla de empleados y quiero mostrar todos los nombres de empleados que tengan más de 4 caracteres en su nombre.

Aquí hay una tabla de ejemplo

ID EmpName Dept
1  Johnny  ACC
2  Dan     IT
3  Amriel  PR
4  Amy     HR
MNX1024
fuente

Respuestas:

181

Si está utilizando SQL Server, utilice la función LEN(Longitud):

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4

MSDN para él dice:

Devuelve el número de caracteres de la expresión de cadena especificada,
excluidos los espacios en blanco finales.

Aquí está el enlace al MSDN

Para oracle / plsql que puede usar Length(), mysql también usa Length.

Aquí está la documentación de Oracle:

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

Y aquí está la documentación de mySQL de Length(string):

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

Para PostgreSQL, puede usar length(string)o char_length(string). Aquí está la documentación de PostgreSQL:

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

JonH
fuente
1
Para desigualdades compuestas, simplemente agregue una ANDdeclaración, por ejemplo SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
alexanderjsingleton
28

JonH ha cubierto muy bien la parte sobre cómo escribir la consulta. Sin embargo, hay otro problema importante que también debe mencionarse, que son las características de rendimiento de dicha consulta. Repitámoslo aquí (adaptado a Oracle):

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

Esta consulta restringe el resultado de una función aplicada a un valor de columna (el resultado de aplicar la LENGTHfunción a la EmployeeNamecolumna). En Oracle, y probablemente en todos los demás RDBMS, esto significa que un índice regular en EmployeeName será inútil para responder a esta consulta; la base de datos realizará un escaneo completo de la tabla, lo que puede ser realmente costoso.

Sin embargo, varias bases de datos ofrecen una función de índices que está diseñada para acelerar consultas como esta. Por ejemplo, en Oracle, puede crear un índice como este:

CREATE INDEX EmployeeTable_EmployeeName_Length ON EmployeeTable(LENGTH(EmployeeName));

Sin embargo, esto podría no ser útil en su caso, porque el índice podría no ser muy selectivo para su condición. Con esto me refiero a lo siguiente: estás solicitando filas en las que la longitud del nombre sea superior a 4. Supongamos que el 80% de los nombres de los empleados en esa tabla son más largos que 4. Bueno, entonces es probable que la base de datos concluya ( correctamente) que no vale la pena usar el índice, porque probablemente tendrá que leer la mayoría de los bloques de la tabla de todos modos.

Sin embargo, si cambia la consulta para decir LENGTH(EmployeeName) <= 4, o LENGTH(EmployeeName) > 35, asumiendo que muy pocos empleados tienen nombres con menos de 5 caracteres o más de 35, entonces el índice se seleccionará y mejorará el rendimiento.

De todos modos, en resumen: tenga cuidado con las características de rendimiento de consultas como la que está intentando escribir.

Luis Casillas
fuente
5

Hoy intenté lo mismo en db2 y lo usé a continuación, en mi caso, tenía espacios al final de los datos de la columna varchar

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

Vipin
fuente
0

Si experimenta el mismo problema al consultar una base de datos DB2, deberá utilizar la siguiente consulta.

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