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

Ugyldige tal

Du kan filtrere de ikke-numeriske værdier fra med en funktion som dette svar giver , eller med et regulært udtryk - som måske skal justeres:

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 violin .

Det vil udelukke de fleste ikke-numre (måske alle, men jeg er ikke så sikker - regex er ikke et stærkt område), selvom Justins funktion sandsynligvis er mere sikker.

Der er dog stadig ingen garanti for, at filterfunktionen vil blive anvendt før støbningen. Hvis dette stadig slår ud, kan du bruge en underforespørgsel til at filtrere ikke-numeriske værdier fra og derefter kontrollere den faktiske værdi af dem, der er tilbage; men du skal sandsynligvis tilføje et tip for at forhindre Oracle i at fjerne underforespørgslen og ændre evalueringsrækkefølgen på dig.

En anden tilgang er en variation af Justins funktion, der returnerer det faktiske tal:

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

Så kan din forespørgsel bruge det:

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

SQL Fiddle .



  1. Får duplikatkolonnenavnsfejl i Django uden nogen åbenbar grund

  2. Forskellige resultater med samme forespørgsel med DB::raw og Eloquent

  3. muligt at filtrere forespørgselssættet efter forespørgsel? django

  4. Ændre flere kolonner i en enkelt sætning