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

Neplatná čísla

Nečíselné hodnoty můžete odfiltrovat pomocí funkce, kterou poskytuje tato odpověď , nebo s regulárním výrazem – což může vyžadovat nějaké úpravy:

select count(1), result_num
from vitals
where test_cd = 'TEMP'
and regexp_like(result_num, '^[-]?[0-9]*[\.]?[0-9]*$')
and cast(result_num as integer) > 104
group by result_num;

SQL Fiddle .

To vyloučí většinu nečíslic (možná všechny, ale nejsem si tak jistý – regulární výraz není silná oblast), i když Justinova funkce je pravděpodobně bezpečnější.

Stále však není zaručeno, že funkce filtru bude aplikována před obsazením. Pokud k tomu stále dochází, můžete použít poddotaz k odfiltrování nečíselných hodnot a poté zkontrolovat skutečnou hodnotu těch, které zbývají; ale pravděpodobně budete muset přidat nápovědu, abyste zabránili Oracle zrušit vnoření poddotazu a změnit pořadí hodnocení na vás.

Dalším přístupem je variace Justinovy ​​funkce, která vrací skutečné číslo:

CREATE OR REPLACE FUNCTION safe_number( p_str IN VARCHAR2 )
  RETURN NUMBER DETERMINISTIC PARALLEL_ENABLE
IS
  l_num NUMBER;
BEGIN
  l_num := to_number( p_str );
  RETURN l_num;
EXCEPTION
  WHEN value_error THEN
    RETURN null;
END safe_number;
/

Pak váš dotaz může použít toto:

select count(1), result_num
from vitals
where test_cd = 'TEMP'
and safe_number(result_num) > 104
group by result_num;

SQL Fiddle .



  1. Simulace group_concat funkce MySQL v Microsoft SQL Server 2005?

  2. MySQLdb v Pythonu:Nelze se připojit k serveru MySQL na 'localhost'

  3. SYSUTCDATETIME() vs GETUTCDATE() na serveru SQL Server:Jaký je rozdíl?

  4. Aktualizace datagridview pomocí mysql