Oracle
 sql >> база данни >  >> RDS >> Oracle

Невалидни числа

Можете да филтрирате нечисловите стойности с функция като този отговор предоставя , или с регулярен израз - който може да се нуждае от известна промяна:

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 .

Това ще изключи повечето не-числа (може би всички, но не съм толкова уверен - регулярният израз не е силна област), въпреки че функцията на Джъстин вероятно е по-безопасна.

Въпреки това все още няма гаранция, че функцията за филтриране ще бъде приложена преди актьорския състав. Ако това все още възникне, можете да използвате подзаявка, за да филтрирате нечислови стойности и след това да проверите действителната стойност на тези, които остават; но вероятно ще трябва да добавите подсказка, за да спрете Oracle да деактивира подзаявката и да промени реда на оценка за вас.

Друг подход е вариант на функцията на Джъстин, която връща действителното число:

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

Тогава вашата заявка може да използва това:

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

SQL Fiddle .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. AWS Python Lambda с Oracle

  2. Как да сравня две стойности на DATE въз основа само на част от датата в Oracle?

  3. Съпоставяне на булево свойство към Oracle с помощта на Entity Framework

  4. Oracle sql за преброяване на екземпляри от различни стойности в една колона

  5. За да промените типа данни на колоната от clob на xmltype