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 13h01Je 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