选择具有多于/少于x个字符的内容

时间:2011-12-14 18:26:25

标签: sql

想知道是否可以在SQL中选择多于/少于x个字符的内容。

例如,我有一个员工表,我想显示名称中包含4个以上字符的所有员工姓名。

这是一个示例表

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

4 个答案:

答案 0 :(得分:148)

如果您使用的是SQL Server,请使用LEN(长度)功能:

SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4

MSDN for it声明:

  

返回指定字符串表达式的字符数,
  不包括尾随空白。

Here's the link to the MSDN

对于oracle / plsql,您可以使用Length(),mysql也使用Length。

以下是Oracle文档:

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

以下是Length(string)的mySQL文档:

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

答案 1 :(得分:20)

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) <= 4LENGTH(EmployeeName) > 35,假设极少数员工的姓名少于5个字符或超过35个字符,那么该索引将被选中并改进性能

无论如何,简而言之:要小心你正在尝试编写的查询的性能特征。

答案 2 :(得分:2)

今天我在db2中尝试使用并在下面使用,在我的情况下,我在varchar列数据末尾有空格

  

SELECT EmployeeName FROM EmployeeTable WHERE   LENGTH(TRIM(EmployeeName))GT; 4;

答案 3 :(得分:0)

如果在查询DB2数据库时遇到相同的问题,则需要使用以下查询。

SELECT * 
FROM OPENQUERY(LINK_DB,'SELECT
CITY,
cast(STATE as varchar(40)) 
FROM DATABASE')