2014-02-19 10 views
26

Ich habe eine Tabelle enthält die Spalten wieWie längste Zeichenfolge in der Tabellenspalte Daten finden

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 will Abrufen von Daten aus CR Spalte, wo es die längste Textzeichenfolge, dh in der aktuellen Tabelle hat es ist ; # WR_1; # WR_2; # WR_3; # WR_4; #. Ich verwende

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

Aber es Retuns

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

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

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

Antwort

47

Der einfachste Weg ist:

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

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

+0

Perfekt !!!! es funktioniert. Danke für die schnelle Antwort. Wie parse ich diese Zeichenfolge **; # WR_1; # WR_2; # WR_3; # WR_4; # ** wie diese 'WR_1, WR_2, WR_3, WR_4 als eine Spalte Daten. – vuyy1182

+0

Mit Access, SELECT TOP gibt Verbindungen zurück. – HansUp

+1

"Zugriff hat keine großen Funktionen, um das zu tun" - Sieht das nicht wie eine gerade "Replace()" Funktion für Sie aus? –

9

Sie können:

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

Mit Jus Ich habe mehr als ein Jahr nach der Veröffentlichung eine Verbesserung erhalten. Ich möchte 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 wahrscheinlich die Tabelle zweimal lesen: einen vollständigen Tabellenscan, um die maximale Länge zu erhalten, und einen weiteren vollständigen Tabellenscan, 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.
  • Normalerweise würde ich DISTINCT zu meiner Abfrage hinzufügen (SELECT DISTINCT CR FROM ...), um jeden Wert nur einmal zu erhalten. Das würde eine Sortieroperation sein, aber nur für die wenigen Datensätze, die bereits gefunden werden. 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. Das Anwenden von LEN auf die Zeichenfolgen ist normalerweise nicht das, was solche Abfragen verlangsamt.
+0

Allgemeines Gutes vergelten Punkte, aber wenn Sie darüber nachdenken, erfordert ein TOP N-Befehl keine Sortierung der gesamten Tabelle, sondern nur einen Puffer der Größe N. Während der Initial-Tabelle s kann es eine binäre Einfügung in den Puffer nur für jene Einzelteile machen, die größer als der Nth sind, den es bis jetzt gesehen hat. –

7

Sie können es wie folgt erhalten:

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

, aber ich bin sicher, es gibt eine elegantere Möglichkeit, es zu tun

1

Statt SELECT max (len (CR)) AS Max_Length_String FROM Tabelle1

Verwenden

SELECT (CR) FROM Tabelle1

WHE RE len (CR) = (max (len (CR) SELECT) FROM table1)

1

Dies ist das erste Ergebnis auf "längste Zeichenfolge in Postgres" Google-Suche war so werde ich für die Suche nach einem Postgres meiner Antwort hier setzen Lösung.

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

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

+0

OP wollte die längste Zeichenfolge, nicht die Länge der längsten Zeichenfolge. –

2

Für Oracle 11g:

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

Für Postgres:

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

Dies gibt Ihnen die Zeichenfolge selbst, modifiziert für Postgres aus @Thorsten Kettner Antwort

1

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; 
0

Ihre Frage zu beantworten, und die Prefix bekommen, für MySQL können Sie tun:

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

und es wird


+-------+----------------------------+--------------------+ 
| Prefix| CR       |   length(CR) | 
+-------+----------------------------+--------------------+ 
| g  | ;#WR_1;#WR_2;#WR_3;#WR_4;# |     26 | 
+-------+----------------------------+--------------------+ 
1 row in set (0.01 sec) 
Verwandte Themen