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

vuy*_*182 43 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
Run Code Online (Sandbox Code Playgroud)

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

SELECT max(len(CR)) AS Max_Length_String FROM table1 
Run Code Online (Sandbox Code Playgroud)

但它重新回归

Max_Length_String
----------------------------------------
26
Run Code Online (Sandbox Code Playgroud)

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

Max_Length_String
----------------------------------------
;#WR_1;#WR_2;#WR_3;#WR_4;# 
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 77

最简单的方法是:

select top 1 CR
from table t
order by len(CR) desc
Run Code Online (Sandbox Code Playgroud)

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


Tho*_*ner 14

您可以:

SELECT CR 
FROM table1 
WHERE len(CR) = (SELECT max(len(CR)) FROM table1)
Run Code Online (Sandbox Code Playgroud)

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

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


xer*_*him 8

你可以这样得到它:

SELECT TOP 1 CR
FROM tbl
ORDER BY len(CR) DESC
Run Code Online (Sandbox Code Playgroud)

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


tmt*_*mes 8

这是“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


Sri*_*ndi 6

对于 Postgres:

SELECT column
FROM table
WHERE char_length(column) = (SELECT max(char_length(column)) FROM table )
Run Code Online (Sandbox Code Playgroud)

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


kav*_*hmb 5

对于 Oracle 11g:

SELECT COL1 
FROM TABLE1 
WHERE length(COL1) = (SELECT max(length(COL1)) FROM TABLE1);
Run Code Online (Sandbox Code Playgroud)


Sho*_*obi 5

通过两个查询就可以实现这一点。这是针对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;
Run Code Online (Sandbox Code Playgroud)