【问题标题】:How to find longest string in the table column data如何在表格列数据中查找最长的字符串
【发布时间】:2014-03-20 01:34:30
【问题描述】:

我有一个表包含像这样的列

  Prefix    |  CR
----------------------------------------
  g         |  ;#WR_1;#WR_2;#WR_3;#WR_4;# 
  v         |  ;#WR_3;#WR_4;#
  j         |  WR_2
  m         |  WR_1
  d         |  ;#WR_3;#WR_4;#   
  f9        |  WR_3

我想从 CR 列中检索数据,其中它具有最长的文本字符串,即在当前表中它是 ;#WR_1;#WR_2;#WR_3;#WR_4;#强>。 我正在使用

SELECT max(len(CR)) AS Max_Length_String FROM table1 

但它会恢复

Max_Length_String
----------------------------------------
26

但我需要的不是长度(26),我想要这样

Max_Length_String
----------------------------------------
;#WR_1;#WR_2;#WR_3;#WR_4;# 

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    而不是 SELECT max(len(CR)) AS Max_Length_String FROM table1

    使用

    从表 1 中选择(CR)

    WHERE len(CR) = (SELECT max(len(CR)) FROM table1)

    【讨论】:

      【解决方案2】:

      在 MySQL 中你可以使用,

      (SELECT CITY, 
              LENGTH(CITY) AS CHR_LEN 
       FROM   STATION 
       ORDER  BY CHR_LEN ASC, 
                 CITY 
       LIMIT  1) 
      UNION 
      (SELECT CITY, 
              LENGTH(CITY) AS CHR_LEN 
       FROM   STATION 
       ORDER  BY CHR_LEN DESC, 
                 CITY 
       LIMIT  1) 
      

      【讨论】:

        【解决方案3】:

        您必须通过在查询中应用 group by 或 query with 来进行一些更改。

        "SELECT CITY,LENGTH(CITY) FROM STATION ORDER BY LENGTH(CITY) DESC LIMIT 1;"
        

        它将返回城市中最长的cityname

        【讨论】:

          【解决方案4】:

          如果列数据类型是 text,您应该使用 DataLength 函数,例如:

          select top 1 CR, DataLength(CR)
          from tbl
          order by DataLength(CR) desc
          

          【讨论】:

            【解决方案5】:
            SELECT CITY,LENGTH(CITY) FROM STATION GROUP BY CITY ORDER BY LENGTH(CITY) ASC LIMIT 1;
            SELECT CITY,LENGTH(CITY) FROM STATION GROUP BY CITY ORDER BY LENGTH(CITY) DESC LIMIT 1;
            

            【讨论】:

              【解决方案6】:

              要回答您的问题,并获得Prefix,对于 MySQL,您可以这样做:

              select Prefix, CR, length(CR) from table1 order by length(CR) DESC limit 1;

              它会返回

              
              +-------+----------------------------+--------------------+
              | Prefix| CR                         |         length(CR) |
              +-------+----------------------------+--------------------+
              | g     | ;#WR_1;#WR_2;#WR_3;#WR_4;# |                 26 |
              +-------+----------------------------+--------------------+
              1 row in set (0.01 sec)
              

              【讨论】:

                【解决方案7】:

                您可以通过两个查询来实现这一点。这是给mysql的

                //will select shortest length coulmn and display its length.
                // only 1 row will be selected, because we limit it by 1
                
                SELECT column, length(column) FROM table order by length(column) asc limit 1;
                
                //will select shortest length coulmn and display its length.
                
                SELECT CITY, length(city) FROM STATION order by length(city) desc limit 1;
                

                【讨论】:

                  【解决方案8】:

                  对于 Postgres:

                  SELECT column
                  FROM table
                  WHERE char_length(column) = (SELECT max(char_length(column)) FROM table )
                  

                  这将为您提供字符串本身,为 @Thorsten Kettner 回答的 postgres 修改

                  【讨论】:

                    【解决方案9】:

                    对于 Oracle 11g:

                    SELECT COL1 
                    FROM TABLE1 
                    WHERE length(COL1) = (SELECT max(length(COL1)) FROM TABLE1);
                    

                    【讨论】:

                      【解决方案10】:

                      你可以:

                      SELECT CR 
                      FROM table1 
                      WHERE len(CR) = (SELECT max(len(CR)) FROM table1)
                      

                      在发布这篇文章一年多之后刚刚收到了一个赞成票,我想补充一些信息。

                      • 此查询给出所有具有最大长度的值。对于 TOP 1 查询,您只能获得其中一项,这通常是不希望的。
                      • 此查询可能必须读取表两次:一次全表扫描以获取最大长度,另一次全表扫描以获取该长度的所有值。然而,这些操作是非常简单的操作,因此相当快。使用 TOP 1 查询,DBMS 从表中读取所有记录,然后对它们进行排序。因此,该表只读取一次,但对整个表进行排序操作是一项艰巨的任务,并且在大型表上可能会非常慢。
                      • 通常会将DISTINCT 添加到我的查询(SELECT DISTINCT CR FROM ...)中,以便只获取每个值一次。这是一个排序操作,但仅限于已经找到的少数记录。同样,没什么大不了的。
                      • 如果必须经常处理字符串长度,可以考虑为其创建一个计算列(计算字段)。这是从 Ms Access 2010 开始可用的。但阅读此内容表明您无法在 MS Access 中为计算字段编制索引。只要这是真的,它们几乎没有任何好处。对字符串应用LEN 通常不会导致此类查询变慢。

                      【讨论】:

                      • 一般来说很好,但是如果你仔细想想,一个 TOP N 命令不需要对整个表进行排序,只需要一个大小为 N 的缓冲区。在初始表扫描期间它可以做仅将那些大于迄今为止看到的第 N 个项目的二进制插入缓冲区。
                      【解决方案11】:

                      这是“postgres 中最长的字符串”谷歌搜索的第一个结果,所以我将把我的答案放在这里给那些寻找 postgres 解决方案的人。

                      SELECT max(char_length(column)) AS Max_Length_String FROM table

                      postgres 文档:http://www.postgresql.org/docs/9.2/static/functions-string.html

                      【讨论】:

                      • OP 想要最长的字符串,而不是最长字符串的长度。
                      • 令人烦恼的是,这仍然是 2020 年的最高成绩:/
                      • select distinct CR, length(CR) crl from some_table order by crl desc limit 1
                      【解决方案12】:

                      你可以这样得到:

                      SELECT TOP 1 CR
                      FROM tbl
                      ORDER BY len(CR) DESC
                      

                      但我敢肯定,有一种更优雅的方式来做到这一点

                      【讨论】:

                        【解决方案13】:

                        最简单的方法是:

                        select top 1 CR
                        from table t
                        order by len(CR) desc
                        

                        请注意,如果有多个具有相同最长长度的值,这只会返回一个值。

                        【讨论】:

                        • 完美!!!它有效。感谢您的及时回答。我如何解析这个字符串 ;#WR_1;#WR_2;#WR_3;#WR_4;# 像这样 'WR_1,WR_2,WR_3,WR_4 作为一列数据。
                        • 使用 Access,SELECT TOP 返回平局。
                        • “Access 没有很好的功能来做这件事” - 这对你来说不是直接的“替换()”功能吗?
                        • @JohnnyBones。 . .我专注于声明的“解析”部分。我认为您可以回答另一个关于此的问题。
                        • 哦。那么这对你来说不是一个直接的“Split()”函数吗? :oP
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2016-06-19
                        • 2021-02-14
                        • 1970-01-01
                        • 1970-01-01
                        • 2020-09-27
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多