如何在表列数据中找到最长的字符串

时间:2014-02-19 15:38:20

标签: sql ms-access

我的表格包含

等列
  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 列中检索数据WHERE它具有最长的文本字符串,即在当前表中它是;#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;# 

13 个答案:

答案 0 :(得分:68)

最简单的方法是:

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

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

答案 1 :(得分:14)

你可以:

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

在发布此消息后,我刚收到一年多的赞成票,我想补充一些信息。

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

答案 2 :(得分:8)

你可以这样:

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

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

答案 3 :(得分:3)

对于Oracle 11g:

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

答案 4 :(得分:2)

这是postgres"最长字符串的第一个结果"谷歌搜索所以我会在这里找到那些寻找postgres解决方案的答案。

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

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

答案 5 :(得分:1)

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

使用

SELECT(CR)FROM table1

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

答案 6 :(得分:1)

对于Postgres:

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

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

答案 7 :(得分:1)

通过两个查询,您可以实现此目的。这是为了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 :(得分:0)

要回答您的问题,并获得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)

答案 9 :(得分:0)

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;

答案 10 :(得分:0)

如果列数据类型为文本,则应使用 DataLength 函数,例如:

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

答案 11 :(得分:0)

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

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

它将返回城市中最长的城市名称

答案 12 :(得分:0)

您可以在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)