Je vois que dans MySQL, il existe 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()
dans PHP est ce que je cherche.
Je suppose que vous voulez vérifier une valeur de chaîne. L’un des moyens de Nice 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
ceil(field) = field
au lieu.
Associez-le à une expression régulière.
c.f. http://forums.mysql.com/read.php?60,1907,38488#msg-38488 comme indiqué ci-dessous:
Re: 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]+)$';
Ceci permet d’obtenir un signe plus/moins facultatif au début, un point décimal facultatif et les chiffres restants.
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 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.
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 vrai si l'année est numérique sinon faux
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
Pour vérifier si une valeur est Int dans Mysql, nous pouvons utiliser la requête suivante. Cette requête donnera les lignes avec les 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 numeric et corrolary:
WHERE table.field != "0" and CAST(table.field as SIGNED) = 0
Le meilleur que je puisse penser à une variable est un int Est une combinaison avec les fonctions de MySQL CAST()
et LENGTH()
.
Cette méthode fonctionnera sur les types de données chaînes, entiers, doubles/flottants.
SELECT (LENGTH(CAST(<data> AS UNSIGNED))) = (LENGTH(<data>)) AS is_int
voir la démo http://sqlfiddle.com/#!9/ff40cd/44
cela échouera si la colonne a un seul caractère. si la colonne a la valeur 'A' alors Cast ('A' comme UNSIGNED) sera évalué à 0 et LENGTH (0) sera égal à 1. So LENGTH (Cast ('A' comme UNSIGNED)) = LENGTH (0) sera évalué à 1 = 1 => 1
Le vrai Waqas Malik est totalement fogoté pour tester cette affaire. le patch est.
SELECT <data>, (LENGTH(CAST(<data> AS UNSIGNED))) = CASE WHEN CAST(<data> AS UNSIGNED) = 0 THEN CAST(<data> AS UNSIGNED) ELSE (LENGTH(<data>)) END AS is_int;
Résultats
**Query #1**
SELECT 1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1 AS UNSIGNED) = 0 THEN CAST(1 AS UNSIGNED) ELSE (LENGTH(1)) END AS is_int;
| 1 | is_int |
| --- | ------ |
| 1 | 1 |
---
**Query #2**
SELECT 1.1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1.1 AS UNSIGNED) = 0 THEN CAST(1.1 AS UNSIGNED) ELSE (LENGTH(1.1)) END AS is_int;
| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0 |
---
**Query #3**
SELECT "1", (LENGTH(CAST("1" AS UNSIGNED))) = CASE WHEN CAST("1" AS UNSIGNED) = 0 THEN CAST("1" AS UNSIGNED) ELSE (LENGTH("1")) END AS is_int;
| 1 | is_int |
| --- | ------ |
| 1 | 1 |
---
**Query #4**
SELECT "1.1", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1.1" AS UNSIGNED) = 0 THEN CAST("1.1" AS UNSIGNED) ELSE (LENGTH("1.1")) END AS is_int;
| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0 |
---
**Query #5**
SELECT "1a", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1a" AS UNSIGNED) = 0 THEN CAST("1a" AS UNSIGNED) ELSE (LENGTH("1a")) END AS is_int;
| 1a | is_int |
| --- | ------ |
| 1a | 0 |
---
**Query #6**
SELECT "1.1a", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("1.1a" AS UNSIGNED) = 0 THEN CAST("1.1a" AS UNSIGNED) ELSE (LENGTH("1.1a")) END AS is_int;
| 1.1a | is_int |
| ---- | ------ |
| 1.1a | 0 |
---
**Query #7**
SELECT "a1", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("a1" AS UNSIGNED) = 0 THEN CAST("a1" AS UNSIGNED) ELSE (LENGTH("a1")) END AS is_int;
| a1 | is_int |
| --- | ------ |
| a1 | 0 |
---
**Query #8**
SELECT "a1.1", (LENGTH(CAST("a1.1" AS UNSIGNED))) = CASE WHEN CAST("a1.1" AS UNSIGNED) = 0 THEN CAST("a1.1" AS UNSIGNED) ELSE (LENGTH("a1.1")) END AS is_int;
| a1.1 | is_int |
| ---- | ------ |
| a1.1 | 0 |
---
**Query #9**
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;
| a | is_int |
| --- | ------ |
| a | 0 |
voir démo
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:
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
), qui signifie 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.
Les éléments suivants renverront la bonne valeur (c.-à-d. 0
) parce que 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 textuel et non numérique.
Toutefois, si vous utilisez des chaînes composées 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’elle ne l’est pas.
Cela fonctionne bien pour VARCHAR où il commence par un chiffre ou non.
WHERE concat('',fieldname * 1) != fieldname
peut avoir des restrictions quand vous arrivez à la plus grande 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 tous les autres retours des choses inutiles pour moi en cas de 234jk456
ou 12 inches