143 votes

Comment vérifier qu'une valeur est un nombre entier dans MySQL ?

Je vois que dans MySQL, il y a 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() en PHP est ce que je recherche.

2 votes

Donc malheureusement nous devons créer la fonction is_int() dans Mysql

247voto

Jumpy Points 1311

Je suppose que vous voulez vérifier une valeur de chaîne de caractères. Un bon moyen 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 la présence de

ceil(field) = field

à la place.

4 votes

Le test 'ceil(field) = field' est une bonne idée, mais comme @Jumpy l'a souligné, il échoue sur les données non numériques : SELECT ceil('quatre') = 'quatre' ; -> 1

7 votes

@MatthewCornell, il a dit que si votre champ est numérique. C'est pour que vous puissiez tester si un nombre est un entier. Cela ne fonctionnera pas sur les chaînes de caractères, c'est pourquoi la première option est là.

0 votes

Si les données peuvent inclure des espaces, cela échouera. Pensez à tester trim(field), éventuellement avec un argument supplémentaire pour supprimer les retours à la ligne.

15voto

JBB Points 2013

Comparez-la à une expression régulière.

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

Re : Clause IsNumeric() dans MySQL ??
Posté par : kevinclark ()
Date : August 08, 2005 01:01PM

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]+)$';

Cela permet d'ajouter un signe plus/moins facultatif au début, un point décimal facultatif et le reste des chiffres.

0 votes

Merci, votre solution prend également en compte les décimales.

14voto

Tarun Sood Points 41

Supposons que nous ayons une colonne avec un champ alphanumérique dont les entrées sont les suivantes

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

et que vous souhaitez obtenir la valeur numérique la plus élevée de cette colonne de la 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]+$'

2 votes

'10000' est plus élevé, mais votre requête retournera toujours '9582' .

9voto

Riad Points 163

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

13 votes

Qu'en est-il SELECT CAST('12a34' AS UNSIGNED) qui renvoie 12 ?

1 votes

Cela fonctionne parfaitement si vous avez besoin de tester des éléments non numériques, cela mérite plus de +1. Les autres réponses sont plus difficiles à inverser le test pour trouver les éléments non numériques.

1 votes

@DrCord cette méthode ne fonctionne pas dans le cas décrit par Mike C, elle est donc très peu fiable.

8voto

Jayjitraj Points 189

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.

34 votes

Dans un varchar, ceci retournera également vrai si le premier caractère est numérique.

0 votes

Je n'avais pas remarqué. Je vote pour votre commentaire :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X