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

87

我有一个包含类似以下列的表:

  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;# 
15个回答

132
最简单的方法是:
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”作为一列数据。 - vuyy1182
在Access中,SELECT TOP返回并列的数据。 - HansUp
1
"Access没有很好的功能来完成这个任务" - 对你来说,这不像是一个直接的“Replace()”函数吗? - Johnny Bones
@JohnnyBones...我关注的是语句中的“解析”部分。我认为还有另一个关于这个问题的问题,你可以回答。 - Gordon Linoff
哦。那对你来说不就像是一个简单的“Split()”函数吗? :oP - Johnny Bones
我正在尝试在VBA中使用这个用户定义函数: 'Sub splitfn() str = ";#WR_1;#WR_2;#WR_3;#WR_4;#" var = Split(str, ";#") For i = 0 To UBound(var) Debug.Print i, var(i) Next i End Sub' 如何使用参数从表格中获取值,而不是硬编码str的值? - vuyy1182

28

你可以:

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 通常不会导致这样的查询变慢。

1
一般来说,这些观点都很好,但如果你仔细想想,一个 TOP N 命令并不需要对整个表进行排序,只需要一个大小为 N 的缓冲区即可。在初始表扫描期间,它可以对那些比它目前看到的第 N 个项目更大的项目进行二进制插入到缓冲区中。 - Tristan Reid

13

OP 想要最长的字符串,而不是最长字符串的长度。 - Andrew Morton
很烦人,这仍然是2020年的最佳结果:/ - Lasf
1
select distinct CR, length(CR) crl from some_table order by crl desc limit 1 - Neil Gaetano Lindberg

11

你可以这样获取:

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

但我相信有一种更优雅的方法来完成它


10

对于Postgres:

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

这将为您提供字符串本身,并根据@Thorsten Kettner的答案对其进行了修改以适用于Postgres。


6

对于 Oracle 11g:

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

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;

2

您需要通过应用group by或在查询中使用子查询来进行一些更改。

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

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


1
 SELECT w.DEPARTMENT 
 FROM  Worker w
 group by w.DEPARTMENT 
 order by length(w.DEPARTMENT) DESC 
 LIMIT 2 ;

这并没有提供问题的答案。如果要批评或请求作者澄清,请在他们的帖子下留言。-【来自审查】 - zkoza
2
@zkoza:它明确地提供了一个答案。它可能是错误的。它肯定需要更多的细节。但它仍然提供了一个答案。 - Jeremy Caney
1
虽然这段代码片段可能解决了问题,但它并没有解释为什么或者如何回答这个问题。请在你的代码中包含一个解释,因为这真的有助于提高你的帖子质量。记住,你正在为未来的读者回答问题,而那些人可能不知道你的代码建议的原因。 - Luca Kiebel
LIMIT 2 可以得到最长的字符串? - General Grievance

1
在MariaDB中,只有lengthchar_length对我有效。
如果您使用非英文字母,则最好使用char_length。 例如:enter image description here
select
 e.id,
 home.name,
 LENGTH(home.name) as length,
 CHAR_LENGTH(home.name) as char_length
from events e 
left join teams home on e.home_id  = home.id
order by CHAR_LENGTH(home.name) desc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接