web-dev-qa-db-fra.com

Comment vérifier si une valeur est un entier dans MySQL?

Je vois que dans MySQL, il existe Cast() et Convert() pour créer des entiers à partir de valeurs, mais existe-t-il un moyen de vérifier si une valeur est un entier? Quelque chose comme is_int() dans PHP est ce que je cherche.

107
Craig Nakamoto

Je suppose que vous voulez vérifier une valeur de chaîne. L’un des moyens de Nice est l’opérateur REGEXP, qui fait correspondre la chaîne à une expression régulière. Il suffit de faire

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

c'est assez rapide. Si votre champ est numérique, il suffit de tester

ceil(field) = field

au lieu.

192
Jumpy

Associez-le à une expression régulière.

c.f. http://forums.mysql.com/read.php?60,1907,38488#msg-38488 comme indiqué ci-dessous:

Re: IsNumeric () dans MySQL?
Publié par: kevinclark ()
Date: 08 août 2005 13h01


Je suis d'accord. Voici une fonction que j'ai créée pour 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]+)$';


Ceci permet d’obtenir un signe plus/moins facultatif au début, un point décimal facultatif et les chiffres restants.

13
JBB

Supposons que nous ayons une colonne avec un champ alphanumérique ayant des entrées comme

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

et vous voulez la valeur numérique la plus élevée de cette colonne de base de données (dans ce cas, il s’agit de 9582), cette requête vous aidera.

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

Voici la solution simple pour cela en supposant que le type de données est varchar

select * from calender where year > 0

Il retournera vrai si l'année est numérique sinon faux

8
Jayjitraj

Cela fonctionne aussi:

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

par exemple

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

Pour vérifier si une valeur est Int dans Mysql, nous pouvons utiliser la requête suivante. Cette requête donnera les lignes avec les valeurs Int

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

Qu'en est-il de:

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

tester numeric et corrolary:

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

Le meilleur que je puisse penser à une variable est un int Est une combinaison avec les fonctions de MySQL CAST() et LENGTH().
Cette méthode fonctionnera sur les types de données chaînes, entiers, doubles/flottants.

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

voir la démo http://sqlfiddle.com/#!9/ff40cd/44

cela échouera si la colonne a un seul caractère. si la colonne a la valeur 'A' alors Cast ('A' comme UNSIGNED) sera évalué à 0 et LENGTH (0) sera égal à 1. So LENGTH (Cast ('A' comme UNSIGNED)) = LENGTH (0) sera évalué à 1 = 1 => 1

Le vrai Waqas Malik est totalement fogoté pour tester cette affaire. le patch est.

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;

Résultats

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

voir démo

2
Raymond Nijland

J'ai essayé d'utiliser les expressions régulières répertoriées ci-dessus, mais elles ne fonctionnent pas pour les éléments suivants:

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

Ce qui précède retournera 1 (TRUE), qui signifie le test de la chaîne '12 INCHES 'par rapport à l'expression régulière ci-dessus, renvoie TRUE. Cela ressemble à un nombre basé sur l'expression régulière utilisée ci-dessus. Dans ce cas, parce que le 12 est au début de la chaîne, l'expression régulière l'interprète comme un nombre.

Les éléments suivants renverront la bonne valeur (c.-à-d. 0) parce que la chaîne commence par des caractères au lieu de chiffres

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

Ce qui précède retournera 0 (FALSE) car le début de la chaîne est textuel et non numérique.

Toutefois, si vous utilisez des chaînes composées de chiffres et de lettres commençant par un nombre, vous n'obtiendrez pas les résultats souhaités. REGEXP interprétera la chaîne comme un nombre valide, alors qu’elle ne l’est pas.

2
Bill Kelly

Cela fonctionne bien pour VARCHAR où il commence par un chiffre ou non.

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

peut avoir des restrictions quand vous arrivez à la plus grande NNNNE + - numéros

0
PodTech.io

pour moi, la seule chose qui fonctionne est:

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

de kevinclark tous les autres retours des choses inutiles pour moi en cas de 234jk456 ou 12 inches

0
Tim