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