Apakah ada cara untuk mendeteksi apakah suatu nilai adalah angka dalam permintaan MySQL? Seperti
SELECT *
FROM myTable
WHERE isANumber(col1) = true
Apakah ada cara untuk mendeteksi apakah suatu nilai adalah angka dalam permintaan MySQL? Seperti
SELECT *
FROM myTable
WHERE isANumber(col1) = true
Jawaban:
Ini seharusnya bekerja dalam banyak kasus.
SELECT * FROM myTable WHERE concat('',col1 * 1) = col1
Itu tidak berfungsi untuk nomor non-standar seperti
1e4
1.2e5
123.
(membuntuti desimal)Anda dapat menggunakan Ekspresi Reguler juga ... itu akan seperti:
SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';
Referensi: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
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:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+$';
Hasil: '111'
(Dalam regex, ^ berarti mulai, dan $ berarti akhir)
Untuk memilih semua catatan di mana bilangan bulat atau angka desimal ada:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12
Hasil: '111' (sama seperti contoh terakhir)
Akhirnya, untuk memilih semua catatan di mana nomor ada, gunakan ini:
SELECT *
FROM myTable
WHERE col1 REGEXP '[0-9]+';
Hasil: 'test0' dan 'test1111' dan '111test' dan '111'
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
SELECT * FROM myTable
WHERE col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$'
Juga akan cocok dengan desimal yang ditandatangani (seperti -1.2, +0.2, 6., 2e9, 1.2e-10 ).
Uji:
drop table if exists myTable;
create table myTable (col1 varchar(50));
insert into myTable (col1)
values ('00.00'),('+1'),('.123'),('-.23e4'),('12.e-5'),('3.5e+6'),('a'),('e6'),('+e0');
select
col1,
col1 + 0 as casted,
col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$' as isNumeric
from myTable;
Hasil:
col1 | casted | isNumeric
-------|---------|----------
00.00 | 0 | 1
+1 | 1 | 1
.123 | 0.123 | 1
-.23e4 | -2300 | 1
12.e-5 | 0.00012 | 1
3.5e+6 | 3500000 | 1
a | 0 | 0
e6 | 0 | 0
+e0 | 0 | 0
Mengembalikan baris numerik
Saya menemukan solusinya dengan permintaan berikut dan berfungsi untuk saya:
SELECT * FROM myTable WHERE col1 > 0;
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
):
SELECT * FROM myTable WHERE !col1 > 0;
SELECT * FROM myTable WHERE col1 = 123;
permintaan akan mengembalikan baris, bahkan nilai col123abc
menggunakan UDF (fungsi yang ditentukan pengguna).
CREATE FUNCTION isnumber(inputValue VARCHAR(50))
RETURNS INT
BEGIN
IF (inputValue REGEXP ('^[0-9]+$'))
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
Lalu ketika Anda bertanya
select isnumber('383XXXX')
- mengembalikan 0
select isnumber('38333434')
- 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:
SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');
semoga ini membantu.
Alternatif lain yang tampaknya lebih cepat daripada REGEXP di komputer saya adalah
SELECT * FROM myTable WHERE col1*0 != col1;
Ini akan memilih semua baris tempat col1 dimulai dengan nilai numerik.
AND col1<>0
untuk menangani pengecualian itu.
'1a'
. BTW: ini setara dengan WHERE col1 <> 0
- rextester.com/DJIS1493
Masih melewatkan versi sederhana ini:
SELECT * FROM myTable WHERE `col1` + 0 = `col1`
(penambahan harus lebih cepat dari perkalian)
Atau versi paling lambat untuk bermain lebih lanjut:
SELECT *,
CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC`
FROM `myTable`
HAVING `IS_NUMERIC` = 1
'a' + 0 = 'a'
BENAR
Saya sarankan: jika pencarian Anda sederhana, Anda dapat menggunakan `
column*1 = column
`operator yang menarik :) bekerja dan lebih cepat daripada di bidang varchar / char
PILIH * DARI myTable WHERE kolom * 1 = kolom;
ABC*1 => 0 (NOT EQU **ABC**)
AB15*A => 15 (NOT EQU **AB15**)
15AB => 15 (NOT EQU **15AB**)
15 => 15 (EQUALS TRUE **15**)
select 'aaa123' >= 0
dan select '123aaa' >= 0
kembali benar?
SELECT * FROM myTable WHERE sign (col1)!=0
tanda ofcourse (0) adalah nol, tetapi kemudian Anda dapat membatasi kueri untuk ...
SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0
UPDATE: Ini tidak 100% dapat diandalkan, karena "1abc" akan mengembalikan tanda 1, tetapi "ab1c" akan mengembalikan nol ... jadi ini hanya bisa berfungsi untuk teks yang tidak dimulai dengan angka.
Saya telah menemukan bahwa ini bekerja dengan cukup baik
if(col1/col1= 1,'number',col1) AS myInfo
Coba Dividing / 1
select if(value/1>0 or value=0,'its a number', 'its not a number') from table