Ich weiß, das hat sehr lange Antwort und sehr alt. Aber ich denke, ich kenne einen anderen guten Weg.
Da alle Antwort Sub-Abfrage verwendet, war es nicht für meine Situation geeignet. So habe ich einen Weg gefunden, die Unterabfrage nicht verwendet wurde.
Angenommen, ich habe Daten wie folgt.
select *
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--output
x
aaaaa
Wenn ich min Wert auswählen es gibt 'aaaaa' da 'a' kleiner als 'x' in ascii bestellen.
select min(a.f)
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--output
aaaaa
Aber wenn ich min Länge wählen es gibt 1 (was für 'x' Wert ist), weil 1 kleiner als 5 in numerischer Reihenfolge ist.
select min(length(a.f))
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--output
1
Und wenn ich min von Länge zu gepolstertem Wert umgewandelt wählen kehrt auch '0000000001' (die 'x' Wert ist), weil '0000000001' kleiner als '0000000005' in ASCII-Reihenfolge.
select min(lpad(length(a.f), 10, '0'))
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--output
0000000001
Und ich kann es mit dem Wert selbst binden.
select lpad(length(a.f), 10, '0') || a.f
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--output
0000000001x
0000000005aaaaa
Jetzt kann ich wählen min Länge und zusammen Wert.
select min(lpad(length(a.f), 10, '0') || a.f)
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--output
0000000001x
Jetzt kann ich nur Wert erhalten, indem substr verwenden.
select substr(min(lpad(length(a.f), 10, '0') || a.f), 11, 999)
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--output
x
Und um die Leistung dieser Abfrage zu verbessern, könnten Sie einen funktionsbasierten Index für 'LENGTH (ColumnA)' hinzufügen. –
Ich denke, dass Sie das Schlüsselwort "DESC" hier entfernen sollten. –
Ich stimme zu - der Beitrag wurde von Jeffrey falsch bearbeitet; Ich werde korrigieren – IMHO