Виберіть щось, що має більше / менше символу x


109

Цікаво, чи можна вибрати щось, що містить більше / менше x символів у SQL.

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

Ось приклад таблиці

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

Відповіді:


181

Якщо ви використовуєте 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/uk/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


1
Для складних нерівностей просто додайте ANDзаяву, наприклад SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
alexanderjsingleton

28

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

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

Цей запит обмежує результат функції, застосованої до значення стовпця (результат застосування LENGTHфункції до EmployeeNameстовпця). В Oracle і, ймовірно, у всіх інших RDBMS, це означає, що регулярний індекс на 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

ВИБІРТЕ Ім’я співробітника ВІД СЛУЖБА ТЕХНІ, ЩО ДЛИНКА (TRIM (EmployeeName))> 4;


0

Якщо у вас виникає та сама проблема під час запиту бази даних DB2, вам потрібно буде використовувати наступний запит.

SELECT * 
FROM OPENQUERY(LINK_DB,'SELECT
CITY,
cast(STATE as varchar(40)) 
FROM DATABASE')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.