Apakah ada cara untuk mendeteksi apakah suatu nilai adalah angka dalam permintaan MySQL? Seperti
SELECT *
FROM myTable
WHERE isANumber(col1) = true
mysql
sql
where-clause
Urbycoz
sumber
sumber
Jawaban:
Ini seharusnya bekerja dalam banyak kasus.
Itu tidak berfungsi untuk nomor non-standar seperti
1e4
1.2e5
123.
(membuntuti desimal)sumber
Anda dapat menggunakan Ekspresi Reguler juga ... itu akan seperti:
Referensi: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
sumber
WHERE col1 NOT REGEXP...
dan untuk kasus di mana Anda mungkin memiliki titik desimal, gunakan regex:^[0-9\.]+$
Jika data Anda adalah 'test', 'test0', 'test1111', '111test', '111'
Untuk memilih semua catatan di mana data int sederhana:
Hasil: '111'
(Dalam regex, ^ berarti mulai, dan $ berarti akhir)
Untuk memilih semua catatan di mana bilangan bulat atau angka desimal ada:
Hasil: '111' (sama seperti contoh terakhir)
Akhirnya, untuk memilih semua catatan di mana nomor ada, gunakan ini:
Hasil: 'test0' dan 'test1111' dan '111test' dan '111'
sumber
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
Juga akan cocok dengan desimal yang ditandatangani (seperti -1.2, +0.2, 6., 2e9, 1.2e-10 ).
Uji:
Hasil:
Demo
sumber
Mengembalikan baris numerik
Saya menemukan solusinya dengan permintaan berikut dan berfungsi untuk saya:
Baris pengembalian permintaan ini hanya memiliki kolom angka di atas nol
col1
Mengembalikan baris non numerik
jika Anda ingin memeriksa kolom bukan angka coba ini dengan trik (
!col1 > 0
):sumber
SELECT * FROM myTable WHERE col1 = 123;
permintaan akan mengembalikan baris, bahkan nilai col123abc
Jawaban ini mirip dengan Dmitry, tetapi akan memungkinkan untuk desimal serta angka positif dan negatif.
sumber
menggunakan UDF (fungsi yang ditentukan pengguna).
Lalu ketika Anda bertanya
- mengembalikan 0
- mengembalikan 1
pilih isnumber (mycol) mycol1, col2, colx dari tablex; - akan mengembalikan 1s dan 0s untuk kolom mycol1
--Anda dapat meningkatkan fungsi untuk mengambil desimal, notasi ilmiah, dll ...
Keuntungan menggunakan UDF adalah Anda dapat menggunakannya di sisi kiri atau kanan perbandingan "where clause" Anda. ini sangat menyederhanakan SQL Anda sebelum dikirim ke database:
semoga ini membantu.
sumber
Alternatif lain yang tampaknya lebih cepat daripada REGEXP di komputer saya adalah
Ini akan memilih semua baris tempat col1 dimulai dengan nilai numerik.
sumber
AND col1<>0
untuk menangani pengecualian itu.'1a'
. BTW: ini setara denganWHERE col1 <> 0
- rextester.com/DJIS1493Masih melewatkan versi sederhana ini:
(penambahan harus lebih cepat dari perkalian)
Atau versi paling lambat untuk bermain lebih lanjut:
sumber
'a' + 0 = 'a'
BENARSaya sarankan: jika pencarian Anda sederhana, Anda dapat menggunakan `
`operator yang menarik :) bekerja dan lebih cepat daripada di bidang varchar / char
sumber
select 'aaa123' >= 0
danselect '123aaa' >= 0
kembali benar?tanda ofcourse (0) adalah nol, tetapi kemudian Anda dapat membatasi kueri untuk ...
sumber
sumber
Saya telah menemukan bahwa ini bekerja dengan cukup baik
sumber
col1 <> 0
dan memberikan positif palsu untuk1a
- rextester.com/HLORBZ1242Coba Dividing / 1
sumber