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.
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.
Jawaban:
Saya akan menganggap Anda ingin memeriksa nilai string. Salah satu cara yang bagus adalah operator REGEXP, mencocokkan string dengan ekspresi reguler. Lakukan saja
select field from table where field REGEXP '^-?[0-9]+$';
ini cukup cepat. Jika bidang Anda numerik, uji saja
ceil(field) = field
sebagai gantinya.
Cocokkan dengan ekspresi reguler.
cf http://forums.mysql.com/read.php?60,1907,38488#msg-38488 seperti dikutip di bawah ini:
Re: Klausa IsNumeric () di MySQL ??
Dikirim oleh: kevinclark ()
Tanggal: 08 Agustus 2005 13:01
Saya setuju. Berikut adalah fungsi yang saya buat untuk MySQL 5:
CREATE FUNCTION IsNumeric (sIn varchar(1024)) RETURNS tinyint
RETURN sIn REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';
Ini memungkinkan adanya tanda plus / minus opsional di awal, satu titik desimal opsional, dan digit numerik lainnya.
Misalkan kita memiliki kolom dengan kolom alfanumerik yang memiliki entri seperti
a41q
1458
xwe8
1475
asde
9582
.
.
.
.
.
qe84
dan Anda menginginkan nilai numerik tertinggi dari kolom db ini (dalam hal ini adalah 9582) maka kueri ini akan membantu Anda
SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$'
Berikut adalah solusi sederhana untuk itu dengan asumsi tipe datanya adalah varchar
select * from calender where year > 0
Ini akan mengembalikan nilai true jika tahun adalah numerik lain salah
Ini juga berfungsi:
CAST( coulmn_value AS UNSIGNED ) // will return 0 if not numeric string.
sebagai contoh
SELECT CAST('a123' AS UNSIGNED) // returns 0
SELECT CAST('123' AS UNSIGNED) // returns 123 i.e. > 0
SELECT CAST('12a34' AS UNSIGNED)
, yang kembali 12
?
Untuk memeriksa apakah suatu nilai adalah Int di Mysql, kita dapat menggunakan query berikut. Kueri ini akan memberikan baris dengan nilai Int
SELECT col1 FROM table WHERE concat('',col * 1) = col;
Yang terbaik yang bisa saya pikirkan tentang variabel adalah int. Apakah kombinasi dengan fungsi MySQL CAST()
dan LENGTH()
.
Metode ini akan bekerja pada tipe data string, integer, doubles / floats.
SELECT (LENGTH(CAST(<data> AS UNSIGNED))) = (LENGTH(<data>)) AS is_int
lihat demo http://sqlfiddle.com/#!9/ff40cd/44
itu akan gagal jika kolom memiliki nilai karakter tunggal. jika kolom memiliki nilai 'A' maka Cast ('A' as UNSIGNED) akan bernilai 0 dan LENGTH (0) akan menjadi 1. jadi LENGTH (Cast ('A' as UNSIGNED)) = LENGTH (0) akan dievaluasi menjadi 1 = 1 => 1
Waqas Malik Sejati benar-benar salah menguji kasus itu. tambalannya.
SELECT <data>, (LENGTH(CAST(<data> AS UNSIGNED))) = CASE WHEN CAST(<data> AS UNSIGNED) = 0 THEN CAST(<data> AS UNSIGNED) ELSE (LENGTH(<data>)) END AS is_int;
Hasil
**Query #1**
SELECT 1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1 AS UNSIGNED) = 0 THEN CAST(1 AS UNSIGNED) ELSE (LENGTH(1)) END AS is_int;
| 1 | is_int |
| --- | ------ |
| 1 | 1 |
---
**Query #2**
SELECT 1.1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1.1 AS UNSIGNED) = 0 THEN CAST(1.1 AS UNSIGNED) ELSE (LENGTH(1.1)) END AS is_int;
| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0 |
---
**Query #3**
SELECT "1", (LENGTH(CAST("1" AS UNSIGNED))) = CASE WHEN CAST("1" AS UNSIGNED) = 0 THEN CAST("1" AS UNSIGNED) ELSE (LENGTH("1")) END AS is_int;
| 1 | is_int |
| --- | ------ |
| 1 | 1 |
---
**Query #4**
SELECT "1.1", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1.1" AS UNSIGNED) = 0 THEN CAST("1.1" AS UNSIGNED) ELSE (LENGTH("1.1")) END AS is_int;
| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0 |
---
**Query #5**
SELECT "1a", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1a" AS UNSIGNED) = 0 THEN CAST("1a" AS UNSIGNED) ELSE (LENGTH("1a")) END AS is_int;
| 1a | is_int |
| --- | ------ |
| 1a | 0 |
---
**Query #6**
SELECT "1.1a", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("1.1a" AS UNSIGNED) = 0 THEN CAST("1.1a" AS UNSIGNED) ELSE (LENGTH("1.1a")) END AS is_int;
| 1.1a | is_int |
| ---- | ------ |
| 1.1a | 0 |
---
**Query #7**
SELECT "a1", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("a1" AS UNSIGNED) = 0 THEN CAST("a1" AS UNSIGNED) ELSE (LENGTH("a1")) END AS is_int;
| a1 | is_int |
| --- | ------ |
| a1 | 0 |
---
**Query #8**
SELECT "a1.1", (LENGTH(CAST("a1.1" AS UNSIGNED))) = CASE WHEN CAST("a1.1" AS UNSIGNED) = 0 THEN CAST("a1.1" AS UNSIGNED) ELSE (LENGTH("a1.1")) END AS is_int;
| a1.1 | is_int |
| ---- | ------ |
| a1.1 | 0 |
---
**Query #9**
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;
| a | is_int |
| --- | ------ |
| a | 0 |
lihat demo
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:
WHERE table.field = "0" or CAST(table.field as SIGNED) != 0
untuk menguji numerik dan korroler:
WHERE table.field != "0" and CAST(table.field as SIGNED) = 0
Saya telah mencoba menggunakan ekspresi reguler yang tercantum di atas, tetapi tidak berfungsi untuk yang berikut:
SELECT '12 INCHES' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...
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 angka
SELECT 'TOP 10' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...
Di 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.
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 ..
WHERE concat('',fieldname * 1) != fieldname
mungkin memiliki batasan ketika Anda mendapatkan nomor NNNNE + - yang lebih besar
set @val = '5'; SELECT @val, concat('', @val * 1) != @val is_int;
bagi saya satu-satunya hal yang berhasil adalah:
CREATE FUNCTION IsNumeric (SIN VARCHAR(1024)) RETURNS TINYINT
RETURN SIN REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';
dari kevinclark semua barang-barang lain yang tidak berguna bagi saya jika terjadi 234jk456
atau12 inches