So che questo ha una risposta molto lunga e molto vecchia. Ma penso di conoscere un altro buon modo.
Poiché tutta la risposta utilizza la query secondaria, non era adatta alla mia situazione. Quindi ho trovato un modo che non è stato usato sotto query.
Dire che ho un dato come segue.
select *
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--output
x
aaaaa
Se seleziono min di valore che restituisce 'aaaaa' perche 'a' è minore di 'x' in ordine ASCII.
select min(a.f)
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--output
aaaaa
Ma se seleziono min di lunghezza restituisce 1 (che è per valore 'x') perché 1 è minore di 5 in ordine numerico.
select min(length(a.f))
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--output
1
E se seleziono min di lunghezza convertito in valore imbottita ritorna anche '0000000001' (che è per il valore 'x') perche '0000000001' è più piccolo rispetto '0000000005' in ordine ASCII.
select min(lpad(length(a.f), 10, '0'))
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--output
0000000001
E posso legarlo con un valore in sé.
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
Ora posso selezionare min di lunghezza e il valore insieme.
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
Ora posso ottenere solo valore utilizzando substr.
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
E, per migliorare le prestazioni di questa query, è possibile aggiungere un indice basato su funzioni su 'LENGTH (ColumnA)'. –
Penso che dovresti rimuovere la parola chiave "DESC" qui. –
Sono d'accordo: il post è stato modificato da Jeffrey in modo errato; Correggerò – IMHO