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

Numeri non validi

Puoi filtrare i valori non numerici con una funzione come questa risposta fornisce o con un'espressione regolare, che potrebbe richiedere qualche ritocco:

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 .

Ciò escluderà la maggior parte dei non numeri (forse tutti, ma non sono così sicuro - regex non è un'area forte), anche se la funzione di Justin è probabilmente più sicura.

Tuttavia, non c'è ancora alcuna garanzia che la funzione di filtro venga applicata prima del cast. Se questo si verifica ancora, puoi utilizzare una sottoquery per filtrare i valori non numerici e quindi controllare il valore effettivo di quelli che rimangono; ma probabilmente dovresti aggiungere un suggerimento per impedire a Oracle di annullare l'annidamento della sottoquery e modificare l'ordine di valutazione su di te.

Un altro approccio è una variazione della funzione di Justin che restituisce il numero effettivo:

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;
/

Quindi la tua query può utilizzare quella:

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

SQL Fiddle .