2011-12-14 18 views
53

Đã 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.Chọn nội dung nào đó có nhiều hơn/ít hơn x ký tự

Ví dụ: tôi có 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ọ.

Dưới đây là một bảng ví dụ

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

Đây có phải là máy chủ sql không? – JonH

Trả lời

103

Nếu bạn đang sử dụng SQL Server, Sử dụng LEN (Length) chức năng:

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4 

MSDN cho nó rằng:

Trả về số ký tự của biểu thức chuỗi được chỉ định,
trừ đường nhỏ g khoảng trống.

Here's the link to the MSDN

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

Dưới đây là tài liệu Oracle:

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

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

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

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

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

+2

Cảm ơn rất nhiều cho tất cả tài liệu và mẹo. – MNX1024

+1

Đối với sự bất bình đẳng hợp chất, chỉ cần thêm câu lệnh 'AND' - * ví dụ *' SELECT thành phố FROM student.zipcode WHERE LENGTH (thành phố)> = 4 VÀ LENGTH (thành phố) <= 9; ' – alexanderjsingleton

14

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

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

truy vấn này được hạn chế kết quả của một hàm áp dụng cho một giá trị cột (kết quả của việc áp dụng LENGTH chức năng để cột EmployeeName). Trong Oracle, và có lẽ trong tất cả các RDBMS khác, điều này có nghĩa là một chỉ mục thường xuyên 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, 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 chỉ mục chức năng tính 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ư thế này:

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

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

Tuy nhiên, nếu bạn thay đổi truy vấn để nói LENGTH(EmployeeName) <= 4 hoặ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 ký tự, thì chỉ mục sẽ được chọn và cải thiện hiệu suất.

Dù sao, trong ngắn hạn: hãy cẩn thận về đặc điểm hiệu suất của các truy vấn giống như truy vấn bạn đang cố viết.

+0

Cảm ơn bạn đã bao gồm sự thích nghi của Oracle. – NickyTheWrench

0

Hôm nay tôi đã cố gắng cùng trong DB2 và sử dụng dưới đây, trong trường hợp của tôi, tôi đã có khoảng trống ở phần cuối của dữ liệu cột VARCHAR

CHỌN EmployeeName TỪ EmployeeTable ĐÂU LENGTH (TRIM (EmployeeName))> 4;

Các vấn đề liên quan