sql >> Database >  >> RDS >> Oracle

Ongeldige nummers

U kunt de niet-numerieke waarden eruit filteren met een functie zoals dit antwoord biedt , of met een reguliere expressie - die misschien wat moet worden aangepast:

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 .

Dat sluit de meeste niet-nummers uit (misschien allemaal, maar ik heb er niet zoveel vertrouwen in - regex is geen sterk gebied), hoewel de functie van Justin waarschijnlijk veiliger is.

Er is echter nog steeds geen garantie dat de filterfunctie vóór de cast wordt toegepast. Als dit nog steeds uitvalt, kunt u een subquery gebruiken om niet-numerieke waarden uit te filteren en vervolgens de werkelijke waarde van de resterende waarden te controleren; maar u zou waarschijnlijk een hint moeten toevoegen om te voorkomen dat Oracle de subquery uit elkaar haalt en de evaluatievolgorde op u wijzigt.

Een andere benadering is een variatie op de functie van Justin die het werkelijke getal retourneert:

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

Dan kan uw vraag dat gebruiken:

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

SQL Fiddle .



  1. SQLAlchemy en Postgres UnicodeDecodeError

  2. Hoe haal ik één set gegevens uit een SQL-query uit meerdere tabellen?

  3. zeer grote mysql-tabel en rapportage

  4. ver.2 PyGreSQL ERROR:from _pg import * ImportError:DLL load failed:De opgegeven module kon niet worden gevonden