it-swarm-id.com

Bagaimana saya memeriksa untuk melihat apakah suatu nilai adalah bilangan bulat di MySQL?

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.

107
Craig Nakamoto

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.

192
Jumpy

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.

13
JBB

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]+$'
10
Tarun Sood

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

8
Jayjitraj

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
6
Riad

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;
4
minhas23

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
3
Tom Auger

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

2
Raymond Nijland

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.

2
Bill Kelly

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

0
PodTech.io

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

0
Tim