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

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

Je suppose que vous voulez vérifier une valeur de chaîne. L’opérateur REGEXP est une bonne façon de faire correspondre la chaîne à une expression régulière. Simplement faire

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

c’est assez rapide. Si votre champ est numérique, testez simplement pour

 ceil(field) = field 

au lieu.

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

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

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

Cela permet un signe optionnel plus / moins au début, un point décimal optionnel et le rest des chiffres.

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 plus haute valeur numérique de cette colonne de firebase database (dans ce cas, il est 9582) alors cette requête vous aidera

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

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

 select * from calender where year > 0 

Il retournera true si l’année est numérique sinon false

Cela fonctionne aussi:

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

par exemple

 SELECT CAST('a123' AS UNSIGNED) // returns 0 SELECT CAST('123' AS UNSIGNED) // returns 123 ie > 0 

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

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

Qu’en est-il de:

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

tester le numeric et le corrolary:

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

J’ai essayé d’utiliser les expressions régulières listé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 ), ce qui signifie que 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.

Ce qui suit retournera la bonne valeur (par exemple 0 ) car 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 du texte et non numérique.

Cependant, si vous traitez des chaînes comportant un nombre et des 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.

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

 SELECT (LENGTH(CAST([data] AS UNSIGNED))) = (LENGTH([data])) AS is_int 

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

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

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

peut avoir des ressortingctions lorsque vous atteignez le plus grand NNNNE + – numéros

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 tout autre retour des choses inutiles pour moi en cas de 234jk456 ou 12 inches