2011-12-14 7 views
53

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

Por ejemplo, tengo una tabla de empleados y quiero mostrar todos los nombres de empleados que tienen 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 
+1

¿Esto es para el servidor sql? – JonH

Respuesta

103

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

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4 

MSDN para que establece:

Devuelve el número de caracteres de la expresión de cadena especificada,
excluyendo trailin g espacios en blanco.

Here's the link to the MSDN

para Oracle/plsql puede utilizar Length(), MySQL también utiliza longitud.

Aquí está la documentación de Oracle:

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

Y aquí es 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 utilizar length(string) o char_length(string). Aquí está la documentación de PostgreSQL:

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

+2

Muchas gracias por todo el documento y la sugerencia. – MNX1024

+1

Para las desigualdades compuestas, simplemente agregue una instrucción 'Y'- * por ejemplo, *' SELECT city FROM student.zipcode WHERE LENGTH (city)> = 4 AND LENGTH (city) <= 9; ' – alexanderjsingleton

14

JohnH ha cubierto muy bien la parte sobre cómo escribir la consulta. Hay otro problema importante que también debe mencionarse, sin embargo, cuáles son las características de rendimiento de dicha consulta. Vamos a repetir aquí (adaptado a Oracle):

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

Esta consulta está restringiendo el resultado de una función aplicada a un valor de columna (el resultado de aplicar la función LENGTH a la columna de EmployeeName). 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 hará un escaneo completo de la tabla, que puede ser realmente costoso.

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

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

Esto todavía no podría ayudar en su caso, sin embargo, ya que el índice podría no ser muy selectiva para su condición. Con esto quiero decir lo siguiente: está pidiendo filas donde la longitud del nombre es más de 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 de todos modos tendrá que leer la mayoría de los bloques en la tabla.

Sin embargo, si cambió 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 sería seleccionado y mejoraría el rendimiento.

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

+0

Gracias por incluir la adaptación de Oracle. – NickyTheWrench

0

Hoy en día yo estaba tratando misma en DB2 y se utiliza a continuación, en mi caso tenía espacios al final de los datos de las columnas varchar

SELECT EmployeeName DE EmployeeTable DONDE LONGITUD (TRIM (EmployeeName))> 4;

Cuestiones relacionadas