2008-09-16 11 views
99

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

+1

donc nous devons malheureusement créer la fonction is_int() Mysql –

Répondre

172

Je suppose que vous voulez vérifier une valeur de chaîne. Un bon moyen est l'opérateur REGEXP, en faisant correspondre la chaîne à une expression régulière. Faites simplement

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

ceci est raisonnablement rapide. Si votre champ est numérique, il suffit de tester

ceil(field) = field 

à la place.

+3

Le « Ceil (champ) = champ » test est une bonne idée, mais comme l'a souligné @Jumpy, elle échoue sur les données non numériques: SELECT ceil ('four') = 'four'; -> 1 –

+1

@MatthewCornell, Il a dit que si votre champ est numérique. C'est ainsi que vous pouvez tester si un nombre est un nombre entier. Cela ne fonctionnera pas sur les chaînes, c'est pourquoi la première option est là. – Malfist

+0

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

10

Correspond à 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?
Publié par: kevinclark()
: 08 Août, 2005 13:01


Je suis d'accord. Voici une fonction que j'ai créé 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 en option, et les chiffres numériques reste.

+0

Merci, votre solution prend soin de décimales également – Ananda

7

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

select * from calender where year > 0 

Il retourne vrai si l'année est numérique autre faux

+27

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

+0

N'a pas remarqué cela. en votant votre commentaire :) – Jayjitraj

1

J'ai essayé d'utiliser les expressions régulières énumérées ci-dessus, mais ils 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 ... 

ci-dessus 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. Il 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.

qui suit retourne la bonne valeur (c.-à-0) parce que la chaîne commence par les caractères au lieu de chiffres

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

ci-dessus retournera 0 (FALSE) parce que le début de la chaîne est un texte et non numérique . Toutefois, si vous traitez des chaînes composées d'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 que ce n'est pas le cas.

+1

Ceci est incorrect. Avez-vous testé? Quand je lance votre premier exemple, il renvoie 'FALSE', comme prévu, car l'expression régulière se termine par' $ ', ce qui signifie la fin de la chaîne, donc elle vérifie seulement les nombres, comme prévu par l'auteur. – spikyjt

2

Qu'en est-:

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

pour tester numérique et le corrolaire:

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

CAST (table.field)! = 0 ne fonctionnera pas car il a besoin d'un type à lancer. – Riad

+0

Cela fonctionne parfaitement si vous devez 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. – DrCord

+0

Ceci ne fonctionne pas pour les nombres comme "0000", "0" (espace) et "7x" (qui est considéré comme un nombre). –

9

Supposons que nous avons colonne avec champ alphanumériques ayant des entrées comme

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

et que vous voulez le plus valeur numérique de cette colonne db (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]+$' 
+0

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

5

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 
+9

qu'en est-il de 'SELECT CAST ('12a34' AS UNSIGNED)', qui renvoie '12'? –

+1

Cela fonctionne parfaitement si vous devez 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. – DrCord

+1

@DrCord cela ne fonctionne pas pour l'affaire Mike C décrit, donc très peu fiable – jontro

2

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

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

Cette réponse a fonctionné pour moi. – Pupil

+0

Cela sélectionnera également des nombres non entiers (par exemple * '3.5' *). –

0

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

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

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

0

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

Questions connexes