2011-12-14 13 views
53

Zastanawiasz się, czy można wybrać coś, co ma więcej/mniej niż x znaków w SQL.Wybierz coś, co ma więcej/mniej niż znak x.

Na przykład mam tabelę pracowników i chcę wyświetlić wszystkie nazwiska pracowników, które mają więcej niż 4 znaki w nazwie.

Oto przykład stół

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

Czy to jest serwer sql? – JonH

Odpowiedz

103

Jeśli używasz programu SQL Server, należy użyć funkcji LEN (długość):

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4 

MSDN stwierdza:

Zwraca liczba znaków określonego wyrażenia ciągu,
z wyłączeniem trailin g puste.

Here's the link to the MSDN

dla Oracle/plsql można użyć Length(), mysql wykorzystuje również długość.

Oto dokumentacja Oracle:

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

A oto dokumentacji MySQL z Length(string):

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

dla PostgreSQL, można użyć length(string) lub char_length(string). Oto dokumentacja PostgreSQL:

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

+2

Wielkie dzięki za cały dokument i napiwek. – MNX1024

+1

Dla nierówności złożonych, po prostu dodaj instrukcję "AND" - * np. * 'WYBIERZ miasto OD student.zipcode GDZIE DŁUGOŚĆ (miasto)> = 4 ORAZ DŁUGOŚĆ (miasto) <= 9;' – alexanderjsingleton

14

JohnH pokrył część bardzo dobrze o tym, jak napisać zapytanie. Jest jeszcze jedna istotna kwestia, którą również należy wspomnieć, co jest charakterystyką wydajnościową takiego zapytania. Powtórzmy tutaj (dostosowany do Oracle):

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

To zapytanie jest ograniczenie wynik funkcji przyłożonego do wartości kolumny (w wyniku zastosowania funkcji LENGTH do kolumny EmployeeName). W Oracle i prawdopodobnie we wszystkich innych RDBMS oznacza to, że regularny indeks EmployeeName będzie bezużyteczny, aby odpowiedzieć na to zapytanie; baza danych wykona pełne skanowanie tabeli, co może być bardzo kosztowne.

Jednak różne bazy danych oferują funkcję indeksów indeksów, która ma na celu przyspieszenie takich zapytań. Na przykład w Oracle, można utworzyć indeks tak:

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

To nie może jeszcze pomóc w twoim przypadku, jednak, ponieważ indeks może nie być bardzo selektywny dla swojej kondycji. Rozumiem przez to: pytasz o wiersze, w których długość nazwy jest większa niż 4. Przyjmijmy, że 80% nazw pracowników w tej tabeli jest dłuższych niż 4.Cóż, wtedy baza danych prawdopodobnie dokończy (poprawnie), że nie warto korzystać z indeksu, ponieważ prawdopodobnie i tak będzie musiała przeczytać większość bloków w tabeli.

Jeśli jednak zmieniono zapytanie, aby powiedzieć LENGTH(EmployeeName) <= 4, lub LENGTH(EmployeeName) > 35, zakładając, że tylko nieliczni pracownicy mają nazwy zawierające mniej niż 5 znaków lub więcej niż 35, indeks zostanie wybrany i poprawi wydajność.

Krótko mówiąc: należy wystrzegać się charakterystyk wydajności takich zapytań jak ten, który próbujesz napisać.

+0

Dziękujemy za uwzględnienie adaptacji Oracle. – NickyTheWrench

0

Dzisiaj starałem sama w DB2 i stosowane poniżej, w moim przypadku miałem spacji na końcu danych kolumn varchar

SELECT EmployeeName OD EmployeeTable GDZIE długość (TRIM (EmployeeName))> 4;