【发布时间】:2012-01-20 12:53:15
【问题描述】:
想知道是否可以在 SQL 中选择多于/少于 x 个字符的内容。
例如,我有一个员工表,我想显示所有姓名中包含超过 4 个字符的员工姓名。
这是一个示例表
ID EmpName Dept
1 Johnny ACC
2 Dan IT
3 Amriel PR
4 Amy HR
【问题讨论】:
标签: sql
想知道是否可以在 SQL 中选择多于/少于 x 个字符的内容。
例如,我有一个员工表,我想显示所有姓名中包含超过 4 个字符的员工姓名。
这是一个示例表
ID EmpName Dept
1 Johnny ACC
2 Dan IT
3 Amriel PR
4 Amy HR
【问题讨论】:
标签: sql
如果您使用的是 SQL Server,请使用 LEN(长度)函数:
SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4
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
【讨论】:
AND 语句 - 例如 SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
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 个字符,那么索引将被选中并提高性能。
总之,简而言之:当心查询的性能特征,比如您尝试编写的查询。
【讨论】:
今天我在 db2 中尝试相同并在下面使用,在我的情况下,我在 varchar 列数据的末尾有空格
从 EmployeeTable WHERE 中选择 EmployeeName 长度(修剪(员工姓名))> 4;
【讨论】:
如果您在查询 DB2 数据库时遇到同样的问题,则需要使用以下查询。
SELECT *
FROM OPENQUERY(LINK_DB,'SELECT
CITY,
cast(STATE as varchar(40))
FROM DATABASE')
【讨论】: