Saya melihat bahwa di dalam MySQL terdapat fungsi Cast()
dan Convert()
untuk membuat bilangan bulat dari nilai, tetapi apakah ada cara untuk memeriksa untuk melihat apakah suatu nilai bilangan bulat? Sesuatu seperti is_int()
dalam PHP adalah apa yang saya cari.
Saya akan menganggap Anda ingin memeriksa nilai string. Salah satu cara yang menyenangkan 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, cukup tes untuk
ceil(field) = field
sebagai gantinya.
Cocokkan dengan ekspresi reguler.
lih. http://forums.mysql.com/read.php?60,1907,38488#msg-38488 seperti dikutip di bawah ini:
Re: IsNumeric () klausa di MySQL ??
Diposting oleh: kevinclark ()
Tanggal: 08 Agustus 2005 01:01 PM
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 untuk tanda plus/minus opsional di awal, satu titik desimal opsional, dan angka numerik lainnya.
Misalkan kita memiliki kolom dengan bidang alfanumerik yang memiliki entri seperti
a41q
1458
xwe8
1475
asde
9582
.
.
.
.
.
qe84
dan Anda ingin nilai numerik tertinggi dari kolom db ini (dalam hal ini adalah 9582) maka permintaan ini akan membantu Anda
SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$'
Ini adalah solusi sederhana untuk itu dengan asumsi tipe data adalah varchar
select * from calender where year > 0
Ini akan mengembalikan true jika tahun itu 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
Untuk memeriksa apakah suatu nilai Int di Mysql, kita dapat menggunakan kueri berikut. Kueri ini akan memberikan baris dengan nilai Int
SELECT col1 FROM table WHERE concat('',col * 1) = col;
Bagaimana dengan:
WHERE table.field = "0" or CAST(table.field as SIGNED) != 0
untuk menguji numerik dan koroner:
WHERE table.field != "0" and CAST(table.field as SIGNED) = 0
Yang terbaik yang bisa saya pikirkan dari sebuah variabel adalah int Merupakan kombinasi dengan fungsi-fungsi MySQL CAST()
dan LENGTH()
.
Metode ini akan bekerja pada tipe data string, integer, double/float.
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' sebagai UNSIGNED) akan mengevaluasi ke 0 dan PANJANG (0) akan menjadi 1. jadi PANJANG (Cast ('A' sebagai UNSIGNED)) = PANJANG (0) akan mengevaluasi ke 1 = 1 => 1
Waqas Malik Sejati benar-benar berkutik untuk menguji kasus itu. tambalan itu.
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
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 kembali 1
(TRUE
), yang berarti pengujian string '12 INCHES 'terhadap ekspresi reguler di atas, menghasilkan TRUE
. Sepertinya angka berdasarkan ekspresi reguler yang digunakan di atas. Dalam kasus ini, karena 12 berada di awal string, ekspresi reguler menafsirkannya sebagai angka.
Berikut ini akan mengembalikan nilai yang benar (mis. 0
) karena string dimulai dengan karakter alih-alih digit
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 dari 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 Anda inginkan. REGEXP akan menafsirkan string sebagai angka yang valid padahal sebenarnya tidak.
Ini bekerja dengan baik untuk VARCHAR di mana ia dimulai dengan angka atau tidak ..
WHERE concat('',fieldname * 1) != fieldname
mungkin memiliki batasan ketika Anda mendapatkan nomor + NNNNE yang lebih besar
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 hal lain yang tidak berguna untuk saya kembali dalam kasus 234jk456
atau 12 inches