Frage So finden Sie die längste Zeichenfolge in den Daten der Tabellenspalte


Ich habe eine Tabelle enthält die Spalten wie

  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

Ich möchte Daten von abrufen CR Spalte WHERE es hat die längste Textzeichenfolge, d. h. in der aktuellen Tabelle ist es ; # WR_1; # WR_2; # WR_3; # WR_4; #. Ich benutze

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

Aber es kommt zurück

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

Aber was ich brauche ist nicht die Länge (26), ich wollte so

Max_Length_String
----------------------------------------
;#WR_1;#WR_2;#WR_3;#WR_4;# 

29
2018-02-19 15:38


Ursprung


Antworten:


Der einfachste Weg ist:

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

Beachten Sie, dass dies nur einen Wert zurückgibt, wenn es mehrere mit der gleichen längsten Länge gibt.


52
2018-02-19 15:46



Sie können:

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

Nachdem ich mehr als ein Jahr nach der Veröffentlichung dieses Artikels eine positive Bewertung erhalten habe, möchte ich einige Informationen hinzufügen.

  • Diese Abfrage gibt alle Werte mit der maximalen Länge an. Bei einer TOP 1 Abfrage erhält man nur eine davon, was normalerweise nicht gewünscht ist.
  • Diese Abfrage muss die Tabelle wahrscheinlich zweimal lesen: eine vollständige Tabellensuche, um die maximale Länge zu erhalten, und eine weitere vollständige Tabellensuche, um alle Werte dieser Länge zu erhalten. Diese Operationen sind jedoch sehr einfache Operationen und daher ziemlich schnell. Mit einer TOP 1-Abfrage liest ein DBMS alle Datensätze aus der Tabelle und sortiert sie anschließend. Daher wird die Tabelle nur einmal gelesen, aber eine Sortieroperation für eine ganze Tabelle ist eine Aufgabe und kann bei großen Tabellen sehr langsam sein.
  • Man würde normalerweise hinzufügen DISTINCT zu meiner Anfrage (SELECT DISTINCT CR FROM ...), um jeden Wert nur einmal zu erhalten. Das würde sei eine Sortieroperation, aber nur für die wenigen Datensätze, die bereits gefunden wurden. Wiederum keine große Sache.
  • Wenn die String-Längen ziemlich oft behandelt werden müssen, könnte man daran denken, eine berechnete Spalte (berechnetes Feld) dafür zu erstellen. Dies steht ab Ms Access 2010 zur Verfügung. Das Nachlesen zeigt jedoch, dass Sie berechnete Felder in MS Access nicht indizieren können. Solange das stimmt, gibt es kaum Vorteile. Bewirbt sich LEN Auf den Strings liegt normalerweise nicht, was solche Abfragen verlangsamt.

13
2018-02-19 15:45



Du kannst es so bekommen:

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

aber ich bin sicher, es gibt einen eleganteren Weg, es zu tun


7
2018-02-19 15:47



Für Oracle 11g:

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

2
2017-08-29 23:22



Dies war das erste Ergebnis bei Google Suche "längste Zeichenfolge in Postgres", also werde ich meine Antwort hier für diejenigen, die nach einer Postgres-Lösung suchen.

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

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


1
2018-01-25 19:37



Für Postgres:

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

Dies gibt dir die Zeichenfolge selbst, modifiziert für Postgres aus @Thorsten Kettners Antwort


1
2017-10-27 10:07



Mit zwei Abfragen können Sie dies erreichen. Dies ist für 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;

1
2018-03-23 05:46



Anstelle von SELECT max (len (CR)) AS Max_Length_String FROM Tabelle1

Benutzen

SELECT (CR) aus Tabelle1

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


1
2018-02-19 15:48