Je vois que dans MySQL il y a Cast()
et des Convert()
fonctions 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()
en PHP est ce que je recherche.
123
Réponses:
Je suppose que vous voulez vérifier une valeur de chaîne. Une manière intéressante est l'opérateur REGEXP, qui fait correspondre la chaîne à une expression régulière. Faites simplement
c'est raisonnablement rapide. Si votre champ est numérique, testez simplement
au lieu.
la source
Faites-le correspondre à une expression régulière.
cf http://forums.mysql.com/read.php?60,1907,38488#msg-38488 comme cité ci-dessous:
la source
Supposons que nous ayons une colonne avec un champ alphanumérique ayant des entrées comme
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
la source
Voici la solution simple en supposant que le type de données est varchar
Il retournera vrai si l'année est numérique sinon faux
la source
Cela fonctionne également:
par exemple
la source
SELECT CAST('12a34' AS UNSIGNED)
, qui revient12
?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
la source
Le meilleur que je puisse penser d'une variable est un int Est une combinaison avec les fonctions de MySQL
CAST()
etLENGTH()
.Cette méthode fonctionnera sur les types de données chaînes, entiers, doubles / flottants.
voir la démo http://sqlfiddle.com/#!9/ff40cd/44
Le vrai Waqas Malik a totalement oublié de tester ce cas. le patch est.
Résultats
voir la démo
la source
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;
set @val = '1.'; SELECT @val, LENGTH(CAST(@val AS SIGNED)) = IF(CAST(@val AS SIGNED) = 0, CAST(@val AS SIGNED), LENGTH(@val)) AS is_int;
Ce refactoring gère tous les cas ci-dessus, mais même mon ajustement ne gère pas -1.0 ou "-1". Encore une fois, une solution super cool.Qu'en est-il de:
pour tester le numérique et le corrolaire:
la source
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:
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, renvoieTRUE
. Il ressemble à un nombre basé sur l'expression régulière utilisée ci-dessus. Dans ce cas, comme 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 (c'est-à-dire
0
) car la chaîne commence par des caractères au lieu de chiffresCe 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 utilisez des chaînes contenant un mélange 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'en fait ce n'est pas le cas.
la source
FALSE
, comme prévu, car l'expression régulière se termine par$
ce qui signifie la fin de la chaîne, elle ne vérifie donc que les nombres, comme prévu par l'auteur.Cela fonctionne bien pour VARCHAR où il commence par un nombre ou non.
peut avoir des restrictions lorsque vous accédez aux numéros NNNNE + - plus grands
la source
set @val = '5'; SELECT @val, concat('', @val * 1) != @val is_int;
pour moi, la seule chose qui fonctionne est:
de kevinclark tous les autres me renvoient des trucs inutiles en cas de
234jk456
ou12 inches
la source