我知道这个答案很长而且很老。
但我想我知道另一种好方法。
因为所有答案都使用子查询,所以不适合我的情况。
于是我找到了一种不使用子查询的方式。
假设我有如下数据。
select *
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--输出
x
aaaaa
如果我选择最小值,它会返回“aaaaa”,因为“a”按 ascii 顺序小于“x”。
select min(a.f)
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--输出
aaaaa
但如果我选择最小长度,它会返回 1(代表“x”值),因为 1 按数字顺序小于 5。
select min(length(a.f))
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--输出
1
如果我选择最小长度转换为填充值也返回'0000000001'(这是'x'值)因为'0000000001'更小
比 '0000000005' 按 ascii 顺序排列。
select min(lpad(length(a.f), 10, '0'))
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--输出
0000000001
我可以将它与值本身绑定。
select lpad(length(a.f), 10, '0') || a.f
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--输出
0000000001x
0000000005aaaaa
现在我可以同时选择长度和值的最小值。
select min(lpad(length(a.f), 10, '0') || a.f)
from (select 'x' f from dual union all select 'aaaaa' from dual) a
--输出
0000000001x
现在我只能通过使用 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
--输出
x