【问题标题】:Select something that has more/less than x character选择多于/少于 x 字符的内容
【发布时间】: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


    【解决方案1】:

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

    SELECT EmployeeName FROM EmployeeTable WHERE LEN(EmployeeName) > 4
    

    MSDN 声明:

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

    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

    【讨论】:

    • 对于复合不等式,只需添加 AND 语句 - 例如 SELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;
    【解决方案2】:

    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 个字符,那么索引将被选中并提高性能。

    总之,简而言之:当心查询的性能特征,比如您尝试编写的查询。

    【讨论】:

      【解决方案3】:

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

      从 EmployeeTable WHERE 中选择 EmployeeName 长度(修剪(员工姓名))> 4;

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-28
          • 1970-01-01
          • 2021-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多