Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Nomor tidak valid

Anda dapat memfilter nilai non-numerik dengan fungsi seperti yang disediakan jawaban ini , atau dengan ekspresi reguler - yang mungkin memerlukan beberapa penyesuaian:

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 .

Itu akan mengecualikan sebagian besar non-angka (mungkin semua, tapi saya tidak terlalu percaya diri - regex bukan area yang kuat), meskipun fungsi Justin mungkin lebih aman.

Namun, masih belum ada jaminan bahwa fungsi filter akan diterapkan sebelum casting. Jika ini masih naik maka Anda dapat menggunakan subquery untuk memfilter nilai non-numerik dan kemudian memeriksa nilai aktual dari nilai yang tersisa; tetapi Anda mungkin perlu menambahkan petunjuk untuk menghentikan Oracle menghapus subkueri dan mengubah urutan evaluasi pada Anda.

Pendekatan lain adalah variasi dari fungsi Justin yang mengembalikan angka sebenarnya:

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

Maka kueri Anda dapat menggunakan itu:

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. Dapatkan catatan terakhir dari kumpulan hasil

  2. XAException di Server Aplikasi Websphere

  3. Cara menginstal ODP.NET 2.111 dan ODP.NET 4.112 di mesin yang sama secara berdampingan sementara keduanya menunjuk ke server database yang sama

  4. C# NHibernate &Oracle Managed Client

  5. Cara Membuat Tabel Bersarang Menggunakan Tipe Data Buatan Pengguna Di Database Oracle