想知道是否可以在SQL中选择多于/少于x个字符的内容。
例如,我有一个员工表,我想显示名称中包含4个以上字符的所有员工姓名。
这是一个示例表
ID EmpName Dept
1 Johnny ACC
2 Dan IT
3 Amriel PR
4 Amy HR
答案 0 :(得分:148)
如果您使用的是SQL Server,请使用LEN
(长度)功能:
SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4
MSDN for it声明:
返回指定字符串表达式的字符数,
不包括尾随空白。
对于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) <= 4
或LENGTH(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')