Wybierz coś, co ma więcej / mniej niż x znaków


109

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

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

Oto przykładowa tabela

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

Odpowiedzi:


181

Jeśli używasz SQL Server, użyj funkcji LEN(Długość):

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4

MSDN stwierdza:

Zwraca liczbę znaków określonego wyrażenia ciągu, z
wyłączeniem końcowych spacji.

Oto link do MSDN

W przypadku oracle / plsql, którego możesz użyć Length(), mysql również używa Length.

Oto dokumentacja Oracle:

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

A oto dokumentacja mySQL Length(string):

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

W przypadku PostgreSQL możesz użyć length(string)lub char_length(string). Oto dokumentacja PostgreSQL:

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


1
W przypadku nierówności złożonych po prostu dodaj ANDoświadczenie SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
alexanderjsingleton

28

JonH bardzo dobrze omówił część dotyczącą pisania zapytania. Jest jeszcze jedna ważna kwestia, o której należy również wspomnieć, a mianowicie charakterystyka wydajności takiego zapytania. Powtórzmy to tutaj (dostosowane do Oracle):

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

To zapytanie ogranicza wynik funkcji zastosowanej do wartości kolumny (wynik zastosowania LENGTHfunkcji do EmployeeNamekolumny). W Oracle i prawdopodobnie we wszystkich innych systemach RDBMS oznacza to, że zwykły indeks EmployeeName będzie bezużyteczny, aby odpowiedzieć na to zapytanie; baza danych wykona pełne skanowanie tabeli, co może być naprawdę kosztowne.

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

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

Może to jednak nie pomóc w twoim przypadku, ponieważ indeks może nie być bardzo selektywny dla twojego stanu. Rozumiem przez to co następuje: pytasz o wiersze, w których długość nazwiska jest większa niż 4. Załóżmy, że 80% nazwisk pracowników w tej tabeli jest dłuższych niż 4. Cóż, wtedy baza danych prawdopodobnie zakończy ( poprawnie), że nie warto używać indeksu, ponieważ prawdopodobnie i tak będzie musiał czytać większość bloków w tabeli.

Jeśli jednak zmienisz zapytanie, aby powiedzieć LENGTH(EmployeeName) <= 4lub LENGTH(EmployeeName) > 35, zakładając, że bardzo niewielu pracowników ma nazwiska zawierające mniej niż 5 znaków lub więcej niż 35, to indeks zostanie wybrany i poprawi wydajność.

W każdym razie, w skrócie: uważaj na parametry wydajności zapytań, takich jak to, które próbujesz napisać.


5

Dzisiaj próbowałem tego samego w db2 i użyłem poniżej, w moim przypadku miałem spacje na końcu danych kolumny varchar

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


0

Jeśli napotykasz ten sam problem podczas wysyłania zapytań do bazy danych DB2, musisz użyć poniższego zapytania.

SELECT * 
FROM OPENQUERY(LINK_DB,'SELECT
CITY,
cast(STATE as varchar(40)) 
FROM DATABASE')
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.