Seleziona qualcosa che abbia più / meno di x caratteri


109

Mi chiedevo se fosse possibile selezionare qualcosa che ha più / meno di x caratteri in SQL.

Ad esempio, ho una tabella dei dipendenti e voglio mostrare tutti i nomi dei dipendenti che contengono più di 4 caratteri nel loro nome.

Ecco una tabella di esempio

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

Risposte:


181

Se stai usando SQL Server, usa la funzione LEN(Lunghezza):

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4

MSDN per esso afferma:

Restituisce il numero di caratteri dell'espressione stringa specificata,
esclusi gli spazi finali.

Ecco il collegamento a MSDN

Per oracle / plsql puoi usare Length(), mysql usa anche Length.

Ecco la documentazione Oracle:

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

Ed ecco la documentazione mySQL di Length(string):

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

Per PostgreSQL, puoi usare length(string)o char_length(string). Ecco la documentazione di PostgreSQL:

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


1
Per le disuguaglianze composti, è sufficiente aggiungere un ANDstatement- ad esempio SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
alexanderjsingleton

28

JonH ha coperto molto bene la parte su come scrivere la query. C'è anche un altro problema significativo che deve essere menzionato, tuttavia, che sono le caratteristiche di prestazione di una simile query. Ripetiamolo qui (adattato a Oracle):

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

Questa query limita il risultato di una funzione applicata a un valore di colonna (il risultato dell'applicazione della LENGTHfunzione alla EmployeeNamecolonna). In Oracle, e probabilmente in tutti gli altri RDBMS, questo significa che un indice regolare su EmployeeName sarà inutile per rispondere a questa domanda; il database eseguirà una scansione completa della tabella, che può essere davvero costosa.

Tuttavia, vari database offrono una funzione di indici di funzione progettata per velocizzare query come questa. Ad esempio, in Oracle, puoi creare un indice come questo:

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

Tuttavia, questo potrebbe non essere d'aiuto nel tuo caso, perché l'indice potrebbe non essere molto selettivo per la tua condizione. Con questo intendo quanto segue: stai chiedendo righe in cui la lunghezza del nome è maggiore di 4. Supponiamo che l'80% dei nomi dei dipendenti in quella tabella sia più lungo di 4. Bene, allora il database probabilmente concluderà ( correttamente) che non vale la pena usare l'indice, perché probabilmente dovrà comunque leggere la maggior parte dei blocchi nella tabella.

Tuttavia, se hai modificato la query in LENGTH(EmployeeName) <= 4o LENGTH(EmployeeName) > 35, supponendo che pochissimi dipendenti abbiano nomi con meno di 5 caratteri o più di 35, l'indice verrebbe selezionato e migliorerebbe le prestazioni.

Comunque, in breve: attenzione alle caratteristiche di prestazione di query come quella che stai cercando di scrivere.


5

Oggi stavo provando lo stesso in db2 e utilizzato di seguito, nel mio caso avevo spazi alla fine dei dati della colonna varchar

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


0

Se si verifica lo stesso problema durante l'interrogazione di un database DB2, sarà necessario utilizzare la query seguente.

SELECT * 
FROM OPENQUERY(LINK_DB,'SELECT
CITY,
cast(STATE as varchar(40)) 
FROM DATABASE')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.