it-swarm.it

Come posso verificare se un valore è un numero intero in MySQL?

Vedo che all'interno di MySQL ci sono Cast() e Convert() funzioni per creare numeri interi da valori, ma c'è un modo per verificare se un valore è un numero intero? Qualcosa come is_int() in PHP è quello che sto cercando.

107
Craig Nakamoto

Presumo che tu voglia controllare un valore di stringa. Un modo piacevole è l'operatore REGEXP, che abbina la stringa a un'espressione regolare. Semplicemente

select field from table where field REGEXP '^-?[0-9]+$';

questo è ragionevolmente veloce. Se il tuo campo è numerico, prova solo per

ceil(field) = field

anziché.

192
Jumpy

Abbinalo a un'espressione regolare.

c.f. http://forums.mysql.com/read.php?60,1907,38488#msg-38488 come riportato di seguito:

Ri: IsNumeric () clausola in MySQL ??
, Pubblicato da: kevinclark ()
Data: 08 agosto 2005 13:01


Sono d'accordo. Ecco una funzione che ho creato per 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]+)$';


Ciò consente un segno più/meno opzionale all'inizio, un punto decimale opzionale e le altre cifre numeriche.

13
JBB

Supponiamo di avere una colonna con un campo alfanumerico con voci simili

a41q
1458
xwe8
1475
asde
9582
.
.
.
.
.
qe84

e vuoi il massimo valore numerico da questa colonna db (in questo caso è 9582), allora questa query ti aiuterà

SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$'
10
Tarun Sood

Ecco la soluzione semplice supponendo che il tipo di dati sia varchar

select * from calender where year > 0

Restituirà vero se l'anno è numerico altrimenti falso

8
Jayjitraj

Questo funziona anche:

CAST( coulmn_value AS UNSIGNED ) // will return 0 if not numeric string.

per esempio

SELECT CAST('a123' AS UNSIGNED) // returns 0
SELECT CAST('123' AS UNSIGNED) // returns 123 i.e. > 0
6
Riad

Per verificare se un valore è Int in Mysql, possiamo usare la seguente query. Questa query fornirà le righe con valori Int

SELECT col1 FROM table WHERE concat('',col * 1) = col;
4
minhas23

Che dire:

WHERE table.field = "0" or CAST(table.field as SIGNED) != 0

per testare numerici e corrolari:

WHERE table.field != "0" and CAST(table.field as SIGNED) = 0
3
Tom Auger

Il meglio che mi viene in mente di una variabile è un int È una combinazione con le funzioni di MySQL CAST() e LENGTH().
Questo metodo funzionerà su stringhe, numeri interi, doppi/float di tipi di dati.

SELECT (LENGTH(CAST(<data> AS UNSIGNED))) = (LENGTH(<data>)) AS is_int

vedi demo http://sqlfiddle.com/#!9/ff40cd/44

fallirà se la colonna ha un valore di singolo carattere. se la colonna ha un valore 'A', Cast ('A' come UNSIGNED) valuterà 0 e LENGTH (0) sarà 1. quindi LENGTH (Cast ('A' come UNSIGNED)) = LENGTH (0) valuterà 1 = 1 => 1

Il vero Waqas Malik è completamente appannato per testare quel caso. la patch è.

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;

Risultati

**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      |

vedi demo

2
Raymond Nijland

Ho provato a utilizzare le espressioni regolari sopra elencate, ma non funzionano per quanto segue:

SELECT '12 INCHES' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...

Quanto sopra restituirà 1 (TRUE), che significa il test della stringa '12 INCHES 'rispetto all'espressione regolare sopra, restituisce TRUE. Sembra un numero basato sull'espressione regolare usata sopra. In questo caso, poiché il 12 è all'inizio della stringa, l'espressione regolare la interpreta come un numero.

Di seguito verrà restituito il valore corretto (ovvero 0) perché la stringa inizia con caratteri anziché cifre

SELECT 'TOP 10' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...

Quanto sopra restituirà 0 (FALSE) perché l'inizio della stringa è testo e non numerico.

Tuttavia, se hai a che fare con stringhe che hanno una combinazione di numeri e lettere che iniziano con un numero, non otterrai i risultati desiderati. REGEXP interpreterà la stringa come un numero valido quando in realtà non lo è.

2
Bill Kelly

Funziona bene con VARCHAR dove inizia con un numero o no.

WHERE concat('',fieldname * 1) != fieldname 

possono avere restrizioni quando si arriva ai numeri NNNNE + più grandi

0
PodTech.io

per me l'unica cosa che funziona è:

CREATE FUNCTION IsNumeric (SIN VARCHAR(1024)) RETURNS TINYINT
RETURN SIN REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';

da kevinclark tutte le altre cose che mi restituiscono inutili in caso di 234jk456 o 12 inches

0
Tim