我从数据库中检索最大号码有问题。问题是这些数字是字符串格式的,因为它们包含一个下划线。
示例案例:我在数据库中有3个数字:
123456 _1,123456 _2,123456 _13,
我想取的最大数字是123456_13(基本上是下划线后最大的),但由于它们是字符串,Oracle按字母顺序处理它们,并按升序排列:
- 123456 _1
- 123456 _13
- 123456 _2
设置123456_2为MAX
这是可能的,如果我不需要通过替换下划线并转换为数字来显示实际的MAX或MIN数字:
SELECT
MAX(TO_NUMBER(REPLACE(number,'_',''))) max_nr,
MIN(TO_NUMBER(REPLACE(number,'_',''))) min_nr
FROM
...
返回12345613 max_nr1234561 min_nr从我的3个例子,但我需要获取实际的数字下划线和显示。
有什么办法可以做到吗?
如果您想同时获得最小值和最大值,您可以使用keep
语法两次,按下划线后所有字符的数字等量排序:
select
max(your_number)
keep (dense_rank last
order by to_number(substr(your_number, instr(your_number, '_') + 1))
) as max_number,
min(your_number)
keep (dense_rank first
order by to_number(substr(your_number, instr(your_number, '_') + 1))
) as min_number
from your_table
可以在ORDER BY
语句和FETCH FIRST 1 ROW
语句中使用REPLACE
select *
from T
order by TO_NUMBER(REPLACE(N,'_')) desc
fetch first 1 rows only;
sqize -在线编辑器