Oracle:查找一个字符串中的最大数字

Oracle:查找一个字符串中的最大数字,oracle,plsql,Oracle,Plsql,我在表的一列中有一些字符串,比如asdfAB98:hjkl、ab188uiopuuab78:jknd。我想知道如何在每行中提取这样一个字符串中的最大数字。例如,这里最大的数字是188、98和78中的188 因为我感兴趣的数字总是在AB之后,所以我考虑使用regexp\u substr。不幸的是,我不知道如何让它输出多行以便使用max子句。PLSQL语言也会很棒。如果你有想法,请给我举个简单的例子。提前谢谢你 您可以将字符串标记为其所有数字分量,然后找到最大值: select max(to_num

我在表的一列中有一些字符串,比如asdfAB98:hjkl、ab188uiopuuab78:jknd。我想知道如何在每行中提取这样一个字符串中的最大数字。例如,这里最大的数字是188、98和78中的188


因为我感兴趣的数字总是在AB之后,所以我考虑使用regexp\u substr。不幸的是,我不知道如何让它输出多行以便使用max子句。PLSQL语言也会很棒。如果你有想法,请给我举个简单的例子。提前谢谢你

您可以将字符串标记为其所有数字分量,然后找到最大值:

select max(to_number(
    regexp_substr('sdfAB98:(hjkl,)AB188(uiop)uuuAB78:jknd', '(\d+)', 1, level))
  ) as max_value
from dual
connect by regexp_substr('sdfAB98:(hjkl,)AB188(uiop)uuuAB78:jknd', '(\d+)', 1, level)
  is not null;

 MAX_VALUE
----------
       188

如果需要从多行获取值,则需要connectby来匹配id,还需要包含对非确定性函数的引用以防止循环;CTE中有两个值:

with your_table (id, str) as (
  select 1, 'sdfAB98:(hjkl,)AB188(uiop)uuuAB78:jknd' from dual
  union all select 2, '123abc456abc78d9' from dual
)
select id, max(to_number(regexp_substr(str, '(\d+)', 1, level, null, 1))) as max_value
from your_table
connect by prior id = id
and prior dbms_random.value is not null
and level <= regexp_count(str, '\d+')
group by id;

        ID  MAX_VALUE
---------- ----------
         1        188
         2        456

您可以将字符串标记为其所有数字组件,然后找到最大值:

select max(to_number(
    regexp_substr('sdfAB98:(hjkl,)AB188(uiop)uuuAB78:jknd', '(\d+)', 1, level))
  ) as max_value
from dual
connect by regexp_substr('sdfAB98:(hjkl,)AB188(uiop)uuuAB78:jknd', '(\d+)', 1, level)
  is not null;

 MAX_VALUE
----------
       188

如果需要从多行获取值,则需要connectby来匹配id,还需要包含对非确定性函数的引用以防止循环;CTE中有两个值:

with your_table (id, str) as (
  select 1, 'sdfAB98:(hjkl,)AB188(uiop)uuuAB78:jknd' from dual
  union all select 2, '123abc456abc78d9' from dual
)
select id, max(to_number(regexp_substr(str, '(\d+)', 1, level, null, 1))) as max_value
from your_table
connect by prior id = id
and prior dbms_random.value is not null
and level <= regexp_count(str, '\d+')
group by id;

        ID  MAX_VALUE
---------- ----------
         1        188
         2        456

如果有多行,则可以选择Alex的答案:

SQL> with your_table (id, str) as (
  2    select 1, 'sdfAB98:(hjkl,)AB188(uiop)uuuAB78:jknd' from dual
  3    union all select 2, '123abc456abc78d9' from dual
  4  )
  5  select id, max(to_number(regexp_substr(str, '\d+', 1, column_value))) max_num
  6  from your_table,
  7       table(cast(multiset(select level from dual
  8                           connect by level <= regexp_count(str, '\d+')
  9                          ) as sys.odcinumberlist))
 10  group by id;

        ID    MAX_NUM
---------- ----------
         1        188
         2        456

SQL>

如果有多行,则可以选择Alex的答案:

SQL> with your_table (id, str) as (
  2    select 1, 'sdfAB98:(hjkl,)AB188(uiop)uuuAB78:jknd' from dual
  3    union all select 2, '123abc456abc78d9' from dual
  4  )
  5  select id, max(to_number(regexp_substr(str, '\d+', 1, column_value))) max_num
  6  from your_table,
  7       table(cast(multiset(select level from dual
  8                           connect by level <= regexp_count(str, '\d+')
  9                          ) as sys.odcinumberlist))
 10  group by id;

        ID    MAX_NUM
---------- ----------
         1        188
         2        456

SQL>

您必须在数据库中执行此操作的原因是什么?在最坏的情况下,在Java中实现它并使用Java存储过程。有什么原因需要在数据库中执行此操作吗?在最坏的情况下,用Java实现它并使用Java存储过程。谢谢!这是一个很好的解决方案。但是,因为我的表中有18亿行。运行代码花了很长时间。。。但我还是在10行上测试了你的代码,效果很好。我实际上是想为数据更新步骤日志找到最大的最新数字标签。因为每个版本都有自己的数字标签,所以我需要一个代码来自动为我找到最新的标签。因此,我将知道下一版本步骤的标签+1。谢谢!这是一个很好的解决方案。但是,因为我的表中有18亿行。运行代码花了很长时间。。。但我还是在10行上测试了你的代码,效果很好。我实际上是想为数据更新步骤日志找到最大的最新数字标签。因为每个版本都有自己的数字标签,所以我需要一个代码来自动为我找到最新的标签。因此,我将知道下一个版本步骤的标签+1。