Выберите то, что имеет больше/меньше, чем символ x

Интересно, можно ли выбрать что-то, что имеет больше/меньше, чем x символов в SQL.

Например, у меня есть таблица сотрудников, и я хочу показать имена всех сотрудников, у которых есть более 4 символов.

Вот пример таблицы

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

Ответ 1

Если вы используете SQL Server, используйте функцию LEN (Длина):

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4

MSDN для него заявляет:

Возвращает количество символов указанного строкового выражения,
исключая конечные пробелы.

Здесь ссылка на MSDN

Для oracle/plsql вы можете использовать Length(), mysql также использует Length.

Вот документация Oracle:

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

И вот mySQL-документация Length(string):

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

Для PostgreSQL вы можете использовать Length(string) или char_length(string). Вот документация PostgreSQL:

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

Ответ 2

JohnH очень хорошо рассказал о том, как писать запрос. Однако есть еще одна важная проблема, которая должна быть упомянута, а именно характеристики производительности такого запроса. Позвольте повторить это здесь (адаптировано к Oracle):

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

Этот запрос ограничивает результат функции, примененной к значению столбца (результат применения функции LENGTH к столбцу EmployeeName). В Oracle и, вероятно, во всех других РСУБД это означает, что регулярный индекс EmployeeName будет бесполезным для ответа на этот запрос; база данных будет выполнять полное сканирование таблицы, что может быть очень дорогостоящим.

Однако различные базы данных предлагают функцию функции index, которая предназначена для ускорения запросов, подобных этому. Например, в Oracle вы можете создать такой индекс:

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

Это может все еще не помочь в вашем случае, потому что индекс может быть не очень избирательным для вашего состояния. Под этим я подразумеваю следующее: вы запрашиваете строки, где длина имени больше 4. Предположим, что 80% имен сотрудников в этой таблице длиннее 4. Ну, тогда база данных, вероятно, собирается заключить ( правильно), что он не стоит использовать индекс, потому что, вероятно, ему придется читать большинство блоков в таблице.

Однако, если вы изменили запрос, чтобы сказать LENGTH(EmployeeName) <= 4 или LENGTH(EmployeeName) > 35, считая, что очень немногие сотрудники имеют имена с числом символов менее 5 или более 35, тогда индекс будет выбран и улучшен.

В любом случае, короче: остерегайтесь характеристик производительности запросов, подобных тем, которые вы пытаетесь написать.