Ich versuche, eine Abfrage zu schreiben, die den kürzesten String-Wert in der Spalte zurückgibt. Für Beispiel: Wenn SpalteA die Werte ABCDE, ZXDR, ERC hat, sollte die Abfrage "ERC" zurückgeben. Ich habe die folgende Abfrage geschrieben, aber ich frage mich, ob es einen besseren Weg gibt, dies zu tun?
Die Abfrage sollte einen einzelnen Wert zurückgeben.
%Vor%Der einfachste Weg mit einem einzigen Tabellenzugriff und ohne Unterabfragen:
%Vor%EDIT: Ich habe das Beispiel so angepasst, dass es noch besser zu Ihrer Beispielabfrage passt:
%Vor%Grüße, Rob.
Diese Frage besteht aus zwei Teilen. Eine alternative Möglichkeit zur Bestimmung der kürzesten Zeichenfolge ist die altmodische Unterabfrage:
%Vor% Was ist besser? Es hängt von der Indexierung, den Datenmengen usw. ab, aber ich würde annehmen, dass Ihre Version wahrscheinlich bessere Ergebnisse erzielt. Es kann auch etwas andere Ergebnisse geben, es sei denn, du hast die where ColumnB = 'XXX'
in der äußeren Abfrage dupliziert.
Wie Ihre Lösung gibt diese Abfrage eine Zeile für jeden Wert von ColumnA zurück, der drei Zeichen lang ist. Wenn Sie eine einzelne Zeile zurückgeben wollen, können Sie dies mit rownum
tun. Wenn Sie ein Kriterium anwenden möchten, um zu bestimmen, welche die erste Zeile ist, die Sie in eine weitere äußere Abfrage einbetten müssen (indem Sie meine Abfrage verwenden, aber auch eine Variante auf Ihrer Seite funktioniert) ...
Wenn ich die Antwort von APC ein wenig erweitere, denke ich, dass es etwas besser wird:
%Vor%IIRC, APCs Subselect wird einmal für jede Zeile in Tabelle ausgeführt. Das glaube ich nicht.
Wenn Sie mehrere Spalten mit derselben Länge in der Spalte haben, erhalten Sie möglicherweise keine konsistenten Ergebnisse aus dieser Abfrage, die mehrmals ausgeführt wird.
Ich weiß, das hat sehr lange und sehr alt. Aber ich denke, ich kenne einen anderen guten Weg.
Da alle Antworten Unterabfragen verwenden, waren sie für meine Situation nicht geeignet. So habe ich einen Weg gefunden, der nicht unterfrage verwendet wurde.
Sagen Sie, ich habe Daten wie folgt.
%Vor%- Ausgabe
%Vor%Wenn ich min of value wähle, wird 'aaaaa' zurückgegeben, weil 'a' kleiner als 'x' in ASCII-Reihenfolge ist.
%Vor%- Ausgabe
%Vor%Aber wenn ich min der Länge wähle, gibt es 1 zurück (was für 'x' Wert ist), weil 1 kleiner als 5 in numerischer Reihenfolge ist.
%Vor%- Ausgabe
%Vor%Und wenn ich min der Länge auswähle, die in den aufgefüllten Wert konvertiert wird, gibt auch '0000000001' zurück (was für 'x' Wert ist), weil '0000000001' kleiner ist als '0000000005' in ASCII-Reihenfolge.
%Vor%- Ausgabe
%Vor%Und ich kann es mit Wert selbst binden.
%Vor%- Ausgabe
%Vor%Jetzt kann ich min Länge und Wert zusammen auswählen.
%Vor%- Ausgabe
%Vor%Jetzt kann ich nur Wert mit substr.
erhalten %Vor%- Ausgabe
%Vor%