Selecione algo que tenha mais / menos de x caracteres

109

Queria saber se é possível selecionar algo que tenha mais / menos que x caracteres no SQL.

Por exemplo, eu tenho uma tabela de funcionários e quero mostrar todos os nomes de funcionários que tenham mais de 4 caracteres em seus nomes.

Aqui está um exemplo de tabela

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

Respostas:

180

Se você estiver usando o SQL Server, use a LENfunção (Comprimento):

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4

MSDN para isso afirma:

Retorna o número de caracteres da expressão de string especificada,
excluindo espaços em branco à direita.

Aqui está o link para o MSDN

Para oracle / plsql que você pode usar Length(), mysql também usa Length.

Aqui está a documentação da Oracle:

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

E aqui está a documentação do mySQL de Length(string):

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

Para PostgreSQL, você pode usar length(string)ou char_length(string). Aqui está a documentação do PostgreSQL:

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

JonH
fonte
1
Para desigualdades compostas, basta adicionar uma ANDdeclaração SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
alexanderjsingleton
28

JonH cobriu muito bem a parte de como escrever a consulta. Há outro problema significativo que também deve ser mencionado, no entanto, que são as características de desempenho de tal consulta. Vamos repetir aqui (adaptado para Oracle):

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

Esta consulta está restringindo o resultado de uma função aplicada a um valor de coluna (o resultado da aplicação da LENGTHfunção à EmployeeNamecoluna). No Oracle, e provavelmente em todos os outros RDBMSs, isso significa que um índice regular em EmployeeName será inútil para responder a essa consulta; o banco de dados fará uma varredura completa da tabela, o que pode ser muito caro.

No entanto, vários bancos de dados oferecem um recurso de índices de função projetado para acelerar consultas como essa. Por exemplo, no Oracle, você pode criar um índice como este:

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

Isso ainda pode não ajudar no seu caso, porque o índice pode não ser muito seletivo para a sua condição. Com isso, quero dizer o seguinte: você está pedindo linhas em que o comprimento do nome seja maior do que 4. Vamos supor que 80% dos nomes dos funcionários nessa tabela sejam maiores do que 4. Bem, então o banco de dados provavelmente será concluído ( corretamente) que não vale a pena usar o índice, porque provavelmente terá que ler a maioria dos blocos na tabela de qualquer maneira.

No entanto, se você alterou a consulta para dizer LENGTH(EmployeeName) <= 4ou LENGTH(EmployeeName) > 35, presumindo que muito poucos funcionários têm nomes com menos de 5 caracteres ou mais de 35, o índice seria escolhido e melhoraria o desempenho.

Enfim, resumindo: tome cuidado com as características de desempenho de consultas como a que você está tentando escrever.

Luis casillas
fonte
5

Hoje tentei mesmo no db2 e usei abaixo, no meu caso tinha espaços no final dos dados da coluna varchar

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

Vipin
fonte
0

Se estiver tendo o mesmo problema ao consultar um banco de dados DB2, você precisará usar a consulta abaixo.

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