Выберите то, что имеет больше/меньше, чем символ 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, тогда индекс будет выбран и улучшен.
В любом случае, короче: остерегайтесь характеристик производительности запросов, подобных тем, которые вы пытаетесь написать.