Chọn thứ gì đó có nhiều hơn / ít hơn x ký tự


109

Đang tự hỏi liệu có thể chọn thứ gì đó có nhiều hơn / ít hơn x ký tự trong SQL hay không.

Ví dụ: tôi có một bảng nhân viên và tôi muốn hiển thị tất cả tên nhân viên có nhiều hơn 4 ký tự trong tên của họ.

Đây là một bảng ví dụ

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

Câu trả lời:


181

Nếu bạn đang sử dụng SQL Server, hãy sử dụng hàm LEN(Độ dài):

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4

MSDN cho nó tuyên bố:

Trả về số ký tự của biểu thức chuỗi đã chỉ định,
không bao gồm khoảng trống ở cuối.

Đây là liên kết đến MSDN

Đối với oracle / plsql bạn có thể sử dụng Length(), mysql cũng sử dụng Chiều dài.

Đây là tài liệu Oracle:

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

Và đây là Tài liệu mySQL của Length(string):

http://dev.mysql.com/doc/refman/5.1/en/string-functions.html# Chức năng_length

Đối với PostgreSQL, bạn có thể sử dụng length(string)hoặc char_length(string). Đây là tài liệu PostgreSQL:

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


1
Đối với bất bình đẳng hợp chất, chỉ cần thêm một ANDCâu lệnh ví dụ SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
alexanderjsingleton

28

JonH đã trình bày rất tốt phần về cách viết truy vấn. Tuy nhiên, có một vấn đề quan trọng khác cũng phải được đề cập, đó là các đặc điểm hiệu suất của một truy vấn như vậy. Hãy lặp lại nó ở đây (thích ứng với Oracle):

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

Truy vấn này giới hạn kết quả của một hàm được áp dụng cho một giá trị cột (kết quả của việc áp dụng LENGTHhàm choEmployeeName cột). Trong Oracle, và có thể trong tất cả các RDBMS khác, điều này có nghĩa là một chỉ mục thông thường trên EmployeeName sẽ vô dụng để trả lời truy vấn này; cơ sở dữ liệu sẽ thực hiện quét toàn bộ bảng, điều này có thể thực sự tốn kém.

Tuy nhiên, các cơ sở dữ liệu khác nhau cung cấp tính năng chỉ mục chức năng được thiết kế để tăng tốc các truy vấn như thế này. Ví dụ, trong Oracle, bạn có thể tạo một chỉ mục như sau:

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

Tuy nhiên, điều này vẫn có thể không hữu ích trong trường hợp của bạn, bởi vì chỉ số có thể không được chọn lọc cho tình trạng của bạn. Ý tôi là như sau: bạn đang yêu cầu các hàng có độ dài của tên hơn 4. Hãy giả sử rằng 80% tên nhân viên trong bảng đó dài hơn 4. Chà, cơ sở dữ liệu có khả năng sẽ kết luận ( chính xác) rằng nó không đáng để sử dụng chỉ mục, bởi vì nó có thể sẽ phải đọc hầu hết các khối trong bảng.

Tuy nhiên, nếu bạn thay đổi truy vấn để nói LENGTH(EmployeeName) <= 4hoặc LENGTH(EmployeeName) > 35, giả sử rằng rất ít nhân viên có tên có ít hơn 5 ký tự hoặc hơn 35, thì chỉ mục sẽ được chọn và cải thiện hiệu suất.

Nói tóm lại: hãy cẩn thận với các đặc điểm hiệu suất của các truy vấn như truy vấn mà bạn đang cố gắng viết.


5

Hôm nay tôi đã thử tương tự trong db2 và được sử dụng bên dưới, trong trường hợp của tôi, tôi có khoảng trắng ở cuối dữ liệu cột varchar

CHỌN Tên nhân viên TỪ BẢNG NHÂN VIÊN TRONG ĐÓ CHIỀU DÀI (TRIM (Tên nhân viên))> 4;


0

Nếu bạn gặp phải vấn đề tương tự khi truy vấn cơ sở dữ liệu DB2, bạn sẽ cần sử dụng truy vấn bên dưới.

SELECT * 
FROM OPENQUERY(LINK_DB,'SELECT
CITY,
cast(STATE as varchar(40)) 
FROM DATABASE')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.