sql >> Database teknologi >  >> RDS >> Oracle

Oracle:find det største tal inden for en streng

Du kan tokenisere strengen til alle dens talkomponenter og derefter finde maksimum:

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

eller

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

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

Hvis du har brug for at hente værdier fra flere rækker, skal du have connect-by'et for at matche ID'erne, og du skal også inkludere en reference til en ikke-deterministisk funktion for at forhindre looping; med to værdier i en 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


  1. subtotal og total for strenge

  2. hvordan får man detaljer fra flere borde?

  3. Hvorfor er en mysqldump med enkelttransaktion mere konsekvent end en uden?

  4. Hvordan nulstiller man postgres' primære nøglesekvens, når den falder ud af synkronisering?