sql >> Databasteknik >  >> RDS >> Oracle

Ogiltiga nummer

Du kan filtrera bort de icke-numeriska värdena med en funktion som det här svaret tillhandahåller , eller med ett reguljärt uttryck - som kan behöva finjusteras:

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

Det kommer att utesluta de flesta icke-nummer (kanske alla, men jag är inte så säker - regex är inte ett starkt område), även om Justins funktion förmodligen är säkrare.

Det finns dock fortfarande ingen garanti för att filterfunktionen kommer att tillämpas före gjutningen. Om detta fortfarande löser sig kan du använda en underfråga för att filtrera bort icke-numeriska värden och sedan kontrollera det faktiska värdet på de som finns kvar; men du skulle förmodligen behöva lägga till en ledtråd för att hindra Oracle från att hämma underfrågan och ändra utvärderingsordningen för dig.

Ett annat tillvägagångssätt är en variant av Justins funktion som returnerar det faktiska numret:

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

Då kan din fråga använda 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. Django ManyToMany genom med flera databaser

  2. Hur infogar man flera poster och får identitetsvärdet?

  3. MySQL:många till många relationer med flera OCH tillstånd

  4. MySQL, frågan är för långsam, hur förbättrar jag den?