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

109

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

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

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

ID EmpName Dept
1  Johnny  ACC
2  Dan     IT
3  Amriel  PR
4  Amy     HR
MNX1024
источник

Ответы:

182

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

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4

В MSDN указано:

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

Вот ссылка на MSDN

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

Вот документация 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/current/static/functions-string.html#FUNCTIONS-STRING-SQL

JonH
источник
1
Для сложных неравенств просто добавьте ANDутверждение, например SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
alexanderjsingleton
29

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

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

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

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

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

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

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

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

Луис Касильяс
источник
5

Сегодня я пробовал то же самое в db2 и использовал ниже, в моем случае у меня были пробелы в конце данных столбца varchar

ВЫБЕРИТЕ EmployeeName ИЗ EmployeeTable, ГДЕ LENGTH (TRIM (EmployeeName))> 4;

Випин
источник
0

Если у вас возникла та же проблема при запросе к базе данных DB2, вам необходимо использовать следующий запрос.

SELECT * 
FROM OPENQUERY(LINK_DB,'SELECT
CITY,
cast(STATE as varchar(40)) 
FROM DATABASE')
Джелани
источник