sql >> Databáze >  >> RDS >> Oracle

Oracle:najděte největší číslo v rámci jednoho řetězce

Můžete tokenizovat řetězec do všech jeho číselných složek a pak najít maximum:

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

nebo

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

Pokud potřebujete získat hodnoty z více řádků, potřebujete, aby se připojení shodovalo s ID a také musíte zahrnout odkaz na nedeterministickou funkci, aby se zabránilo zacyklení; se dvěma hodnotami v 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. Proč jsou logické čtení pro agregační funkce v okně tak vysoké?

  2. EF6 MySQL StrongTypingException, když sloupec není PK

  3. Provést více dotazů na migraci tabulky laravel alter v jednom?

  4. mysql - nějaký způsob, jak pomoci fulltextovému vyhledávání s jiným indexem?