Oracle SQL MAX() and MIN() with string



我从数据库中检索最大号码有问题。问题是这些数字是字符串格式的,因为它们包含一个下划线。

示例案例:我在数据库中有3个数字:

123456 _1,123456 _2,123456 _13,

我想取的最大数字是123456_13(基本上是下划线后最大的),但由于它们是字符串,Oracle按字母顺序处理它们,并按升序排列:

  1. 123456 _1
  2. 123456 _13
  3. 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
MIN_NUMBER123456 _1

可以在ORDER BY语句和FETCH FIRST 1 ROW语句中使用REPLACE

select *
from T
order by TO_NUMBER(REPLACE(N,'_')) desc
fetch first 1 rows only;

sqize -在线编辑器

最新更新