Подтвердить что ты не робот

Как найти самую длинную строку в данных столбца таблицы

У меня таблица содержит столбцы типа

  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;# 
4b9b3361

Ответ 1

Самый простой способ:

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

Обратите внимание, что это будет возвращать только одно значение, если несколько с той же самой длинной длиной.

Ответ 2

Вы можете:

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

Только после того, как вы отправили это сообщение, я получил дополнительную информацию. Я хотел бы добавить некоторую информацию.

  • Этот запрос дает все значения с максимальной длиной. С запросом TOP 1 вы получаете только один из них, который обычно не нужен.
  • Этот запрос должен, вероятно, дважды прочитать таблицу: полное сканирование таблицы, чтобы получить максимальную длину и другое полное сканирование таблицы, чтобы получить все значения этой длины. Однако эти операции являются очень простыми и, следовательно, довольно быстрыми. При запросе TOP 1 СУБД считывает все записи из таблицы, а затем сортирует их. Таким образом, таблица читается только один раз, но операция сортировки на всей таблице является довольно определенной задачей и может быть очень медленной на больших таблицах.
  • Обычно можно добавить DISTINCT к моему запросу (SELECT DISTINCT CR FROM ...), чтобы получить каждое значение только один раз. Это будет операция сортировки, но только на несколько найденных записей. Опять же, неважно.
  • Если длины строк нужно обрабатывать довольно часто, можно подумать о создании для него вычисленного столбца (вычисленное поле). Это доступно как из Ms Access 2010. Но чтение этого показывает, что вы не можете индексировать рассчитанные поля в MS Access. До тех пор, пока это будет справедливо, от них вряд ли удастся извлечь выгоду. Применение LEN в строках обычно не означает, что такие запросы замедляются.

Ответ 3

Вы можете сделать это следующим образом:

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

но я уверен, есть более элегантный способ сделать это

Ответ 4

Это был первый результат поиска google-поиска "longest string in 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

Для Oracle 11g:

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

Ответ 6

Вместо SELECT max (len (CR)) AS Max_Length_String FROM table1

Использование

SELECT (CR) FROM table1

ГДЕ len (CR) = (SELECT max (len (CR)) FROM table1)

Ответ 7

Для Postgres:

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

Это даст вам строку, измененную для postgres из ответа @Thorsten Kettner

Ответ 8

С двумя запросами вы можете добиться этого. Это для 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;

Ответ 9

Чтобы ответить на ваш вопрос и получить 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)