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 LENGTH
funkcji do EmployeeName
kolumny). 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) <= 4
lub 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ć.
AND
oświadczenieSELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;