Saya melihat bahwa di dalam MySQL ada Cast()
dan Convert()
fungsi untuk membuat bilangan bulat dari nilai, tetapi apakah ada cara untuk memeriksa apakah suatu nilai adalah bilangan bulat? Sesuatu seperti is_int()
di PHP adalah apa yang saya cari.
123
Jawaban:
Saya akan menganggap Anda ingin memeriksa nilai string. Salah satu cara yang bagus adalah operator REGEXP, mencocokkan string dengan ekspresi reguler. Lakukan saja
ini cukup cepat. Jika bidang Anda numerik, uji saja
sebagai gantinya.
sumber
Cocokkan dengan ekspresi reguler.
cf http://forums.mysql.com/read.php?60,1907,38488#msg-38488 seperti dikutip di bawah ini:
sumber
Misalkan kita memiliki kolom dengan kolom alfanumerik yang memiliki entri seperti
dan Anda menginginkan nilai numerik tertinggi dari kolom db ini (dalam hal ini adalah 9582) maka kueri ini akan membantu Anda
sumber
Berikut adalah solusi sederhana untuk itu dengan asumsi tipe datanya adalah varchar
Ini akan mengembalikan nilai true jika tahun adalah numerik lain salah
sumber
Ini juga berfungsi:
sebagai contoh
sumber
SELECT CAST('12a34' AS UNSIGNED)
, yang kembali12
?Untuk memeriksa apakah suatu nilai adalah Int di Mysql, kita dapat menggunakan query berikut. Kueri ini akan memberikan baris dengan nilai Int
sumber
Yang terbaik yang bisa saya pikirkan tentang variabel adalah int. Apakah kombinasi dengan fungsi MySQL
CAST()
danLENGTH()
.Metode ini akan bekerja pada tipe data string, integer, doubles / floats.
lihat demo http://sqlfiddle.com/#!9/ff40cd/44
Waqas Malik Sejati benar-benar salah menguji kasus itu. tambalannya.
Hasil
lihat demo
sumber
SELECT "a", (LENGTH(CAST("a" AS UNSIGNED))) = CASE WHEN CAST("a" AS UNSIGNED) = 0 THEN CAST("a" AS UNSIGNED) ELSE (LENGTH("a")) END AS is_int;
set @val = '1.'; SELECT @val, LENGTH(CAST(@val AS SIGNED)) = IF(CAST(@val AS SIGNED) = 0, CAST(@val AS SIGNED), LENGTH(@val)) AS is_int;
Refactoring ini menangani semua kasus di atas, tetapi bahkan penyesuaian saya tidak menangani -1.0 atau '-1.' Sekali lagi, solusi yang sangat keren.Bagaimana dengan:
untuk menguji numerik dan korroler:
sumber
Saya telah mencoba menggunakan ekspresi reguler yang tercantum di atas, tetapi tidak berfungsi untuk yang berikut:
Di atas akan mengembalikan
1
(TRUE
), yang berarti pengujian string '12 INCHES 'terhadap ekspresi reguler di atas, mengembalikanTRUE
. Sepertinya angka yang didasarkan pada ekspresi reguler yang digunakan di atas. Dalam kasus ini, karena 12 berada di awal string, ekspresi reguler menafsirkannya sebagai angka.Yang berikut ini akan mengembalikan nilai yang benar (yaitu
0
) karena string dimulai dengan karakter, bukan angkaDi atas akan kembali
0
(FALSE
) karena awal string adalah teks dan bukan numerik.Namun, jika Anda berurusan dengan string yang memiliki campuran angka dan huruf yang dimulai dengan angka, Anda tidak akan mendapatkan hasil yang diinginkan. REGEXP akan menafsirkan string sebagai angka yang valid padahal sebenarnya tidak.
sumber
FALSE
, seperti yang diharapkan, karena regex berakhir dengan$
yang berarti akhir dari string, jadi hanya memeriksa angka, seperti yang dimaksudkan oleh penulis.Ini berfungsi dengan baik untuk VARCHAR yang dimulai dengan angka atau tidak ..
mungkin memiliki batasan ketika Anda mendapatkan nomor NNNNE + - yang lebih besar
sumber
set @val = '5'; SELECT @val, concat('', @val * 1) != @val is_int;
bagi saya satu-satunya hal yang berhasil adalah:
dari kevinclark semua barang-barang lain yang tidak berguna bagi saya jika terjadi
234jk456
atau12 inches
sumber