How to find longest string in the table column data
Asked Answered
P

15

89

I've a table contains the columns like

  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

I want to retrieve data from CR column WHERE it has the longest text string i.e in current table it is ;#WR_1;#WR_2;#WR_3;#WR_4;#. I'm using

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

But it retuns

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

But what i need is not the length (26), i wanted like this

Max_Length_String
----------------------------------------
;#WR_1;#WR_2;#WR_3;#WR_4;# 
Paintbox answered 19/2, 2014 at 15:38 Comment(0)
M
133

The easiest way is:

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

Note that this will only return one value if there are multiple with the same longest length.

Magistral answered 19/2, 2014 at 15:46 Comment(6)
Perfect!!!! it works.Thank you for prompt answer. How do i parse this String ;#WR_1;#WR_2;#WR_3;#WR_4;# like this 'WR_1,WR_2,WR_3,WR_4 As one column data.Paintbox
With Access, SELECT TOP returns ties.Socinus
"Access doesn't have great functions for doing that" - Doesn't that look like a straight "Replace()" function to you?Shaun
@JohnnyBones . . . I was focused on the "parse" part of the statement. I think there is another question about this that you can answer.Magistral
Oh. Then doesn't that look like a straight "Split()" function to you? :oPShaun
I'm trying to use this user defind function in 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' In stead of hard coding the str value, how can i use parameters to get values from table from tablePaintbox
C
29

You can:

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

Having just recieved an upvote more than a year after posting this, I'd like to add some information.

  • This query gives all values with the maximum length. With a TOP 1 query you get only one of these, which is usually not desired.
  • This query must probably read the table twice: a full table scan to get the maximum length and another full table scan to get all values of that length. These operations, however, are very simple operations and hence rather fast. With a TOP 1 query a DBMS reads all records from the table and then sorts them. So the table is read only once, but a sort operation on a whole table is quite some task and can be very slow on large tables.
  • One would usually add DISTINCT to my query (SELECT DISTINCT CR FROM ...), so as to get every value just once. That would be a sort operation, but only on the few records already found. Again, no big deal.
  • If the string lengths have to be dealt with quite often, one might think of creating a computed column (calculated field) for it. This is available as of Ms Access 2010. But reading up on this shows that you cannot index calculated fields in MS Access. As long as this holds true, there is hardly any benefit from them. Applying LEN on the strings is usually not what makes such queries slow.
Clammy answered 19/2, 2014 at 15:45 Comment(1)
Generally good points, but if you think about it, a TOP N command doesn't require a sort of the whole table, just requires a buffer of size N. During the initial table scan it can do a binary insertion into the buffer for only those items bigger than the Nth that it's seen so far.Kubiak
T
13

This was the first result on "longest string in postgres" google search so I'll put my answer here for those looking for a postgres solution.

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

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

Tiernan answered 25/1, 2016 at 19:37 Comment(3)
OP wanted the longest string, not the length of the longest string.Trichomonad
Annoying how this is still the top result in 2020 :/Thomasina
select distinct CR, length(CR) crl from some_table order by crl desc limit 1Capacious
U
11

You can get it like this:

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

but i'm sure, there is a more elegant way to do it

Unbent answered 19/2, 2014 at 15:47 Comment(0)
M
11

For Postgres:

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

This will give you the string itself,modified for postgres from @Thorsten Kettner answer

Miracidium answered 27/10, 2016 at 10:7 Comment(0)
C
6

For Oracle 11g:

SELECT COL1 
FROM TABLE1 
WHERE length(COL1) = (SELECT max(length(COL1)) FROM TABLE1);
Container answered 29/8, 2016 at 23:22 Comment(0)
M
5

With two queries you can achieve this. This is for 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;
Metallurgy answered 23/3, 2017 at 5:46 Comment(0)
H
2

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

Use

SELECT (CR) FROM table1

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

Hirsh answered 19/2, 2014 at 15:48 Comment(0)
L
2

you have to do some changes by applying group by or query with in query.

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

it will return longest cityname from city.

Ledger answered 21/8, 2020 at 9:39 Comment(0)
T
1

To answer your question, and get the Prefix too, for MySQL you can do:

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

and it will return


+-------+----------------------------+--------------------+
| Prefix| CR                         |         length(CR) |
+-------+----------------------------+--------------------+
| g     | ;#WR_1;#WR_2;#WR_3;#WR_4;# |                 26 |
+-------+----------------------------+--------------------+
1 row in set (0.01 sec)
Trotline answered 27/4, 2017 at 11:4 Comment(0)
M
1

In MySQL you can use,

(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) 
Mosasaur answered 18/10, 2020 at 3:48 Comment(0)
A
1
 SELECT w.DEPARTMENT 
 FROM  Worker w
 group by w.DEPARTMENT 
 order by length(w.DEPARTMENT) DESC 
 LIMIT 2 ;
Anguiano answered 8/1, 2022 at 17:11 Comment(4)
This does not provide an answer to the question. To critique or request clarification from an author, leave a comment below their post. - From ReviewBessette
@zkoza: It clearly offers an answer. It may be wrong. It certainly could use additional detail. But it nevertheless offers an answer.Hudibrastic
While this code snippet may solve the problem, it doesn't explain why or how it answers the question. Please include an explanation for your code, as that really helps to improve the quality of your post. Remember that you are answering the question for readers in the future, and those people might not know the reasons for your code suggestion.Canning
LIMIT 2 gets you the longest string?Oira
P
1

In MariaDB only length and char_length worked for me.

If you use non-english letters, you better use char_length. enter image description here For example:

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
Pariah answered 9/1, 2022 at 12:59 Comment(0)
S
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;
Scorn answered 3/6, 2020 at 12:2 Comment(0)
P
0

If column datatype is text you should use DataLength function like:

select top 1 CR, DataLength(CR)
from tbl
order by DataLength(CR) desc
Prothonotary answered 29/7, 2020 at 7:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.