Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Số không hợp lệ

Bạn có thể lọc ra các giá trị không phải số bằng một chức năng như câu trả lời này cung cấp hoặc với một biểu thức chính quy - có thể cần một số điều chỉnh:

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 .

Điều đó sẽ loại trừ hầu hết các số không phải là số (có thể là tất cả, nhưng tôi không tự tin như vậy - regex không phải là lĩnh vực mạnh), mặc dù chức năng của Justin có lẽ an toàn hơn.

Tuy nhiên, vẫn không có gì đảm bảo rằng chức năng bộ lọc sẽ được áp dụng trước khi truyền. Nếu điều này vẫn tăng lên thì bạn có thể sử dụng một truy vấn con để lọc ra các giá trị không phải số và sau đó kiểm tra giá trị thực của những giá trị còn lại; nhưng bạn có thể cần thêm một gợi ý để ngăn Oracle bỏ ghi chú truy vấn con và thay đổi thứ tự đánh giá đối với bạn.

Một cách tiếp cận khác là một biến thể của hàm Justin trả về số thực:

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

Sau đó, truy vấn của bạn có thể sử dụng:

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. Oracle 11g - Chạy con trỏ PL / SQL

  2. Tại sao việc kiểm tra null lại làm chậm truy vấn này?

  3. Làm thế nào để thay đổi số (7,2) thành varchar trong oracle?

  4. Nhận loại dữ liệu của trường trong câu lệnh chọn trong ORACLE

  5. Các đối tượng Oracle được sử dụng rộng rãi như thế nào?