Existe-t-il un moyen de détecter si une valeur est un nombre dans une requête MySQL? Tel que
SELECT *
FROM myTable
WHERE isANumber(col1) = true
Existe-t-il un moyen de détecter si une valeur est un nombre dans une requête MySQL? Tel que
SELECT *
FROM myTable
WHERE isANumber(col1) = true
Réponses:
Cela devrait fonctionner dans la plupart des cas.
SELECT * FROM myTable WHERE concat('',col1 * 1) = col1
Cela ne fonctionne pas pour les nombres non standard comme
1e4
1.2e5
123.
(décimal de fin)Vous pouvez également utiliser l'expression régulière ... ce serait comme:
SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';
Référence: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
WHERE col1 NOT REGEXP...
et pour le cas où vous pourriez avoir une virgule décimale, utilisez l'expression régulière:^[0-9\.]+$
Si vos données sont "test", "test0", "test1111", "111test", "111"
Pour sélectionner tous les enregistrements où les données sont un simple int:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+$';
Résultat: '111'
(Dans regex, ^ signifie début et $ signifie fin)
Pour sélectionner tous les enregistrements contenant un nombre entier ou décimal:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12
Résultat: '111' (identique au dernier exemple)
Enfin, pour sélectionner tous les enregistrements où le nombre existe, utilisez ceci:
SELECT *
FROM myTable
WHERE col1 REGEXP '[0-9]+';
Résultat: 'test0' et 'test1111' et '111test' et '111'
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
SELECT * FROM myTable
WHERE col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$'
Correspondra également aux décimales signées (comme -1,2, +0,2, 6., 2e9, 1,2e-10 ).
Tester:
drop table if exists myTable;
create table myTable (col1 varchar(50));
insert into myTable (col1)
values ('00.00'),('+1'),('.123'),('-.23e4'),('12.e-5'),('3.5e+6'),('a'),('e6'),('+e0');
select
col1,
col1 + 0 as casted,
col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$' as isNumeric
from myTable;
Résultat:
col1 | casted | isNumeric
-------|---------|----------
00.00 | 0 | 1
+1 | 1 | 1
.123 | 0.123 | 1
-.23e4 | -2300 | 1
12.e-5 | 0.00012 | 1
3.5e+6 | 3500000 | 1
a | 0 | 0
e6 | 0 | 0
+e0 | 0 | 0
Renvoie des lignes numériques
J'ai trouvé la solution avec la requête suivante et fonctionne pour moi:
SELECT * FROM myTable WHERE col1 > 0;
Cette requête renvoie des lignes ayant uniquement une colonne numérique supérieure à zéro col1
Renvoie des lignes non numériques
si vous voulez vérifier la colonne non numérique, essayez celle-ci avec l'astuce ( !col1 > 0
):
SELECT * FROM myTable WHERE !col1 > 0;
SELECT * FROM myTable WHERE col1 = 123;
requête retournera des lignes, même la valeur de col est123abc
utiliser une UDF (fonction définie par l'utilisateur).
CREATE FUNCTION isnumber(inputValue VARCHAR(50))
RETURNS INT
BEGIN
IF (inputValue REGEXP ('^[0-9]+$'))
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
Puis quand vous interrogez
select isnumber('383XXXX')
--retourne 0
select isnumber('38333434')
- retourne 1
sélectionnez isnumber (mycol) mycol1, col2, colx dans tablex; - renverra 1 et 0 pour la colonne mycol1
- vous pouvez améliorer la fonction pour prendre des décimales, la notation scientifique, etc.
L'avantage d'utiliser un UDF est que vous pouvez l'utiliser sur le côté gauche ou droit de votre comparaison "clause where". cela simplifie grandement votre SQL avant d'être envoyé à la base de données:
SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');
J'espère que cela t'aides.
Une autre alternative qui semble plus rapide que REGEXP sur mon ordinateur est
SELECT * FROM myTable WHERE col1*0 != col1;
Cela sélectionnera toutes les lignes où col1 commence par une valeur numérique.
AND col1<>0
pour gérer cette exception.
'1a'
. BTW: c'est équivalent à WHERE col1 <> 0
- rextester.com/DJIS1493
Il manque toujours cette version simple:
SELECT * FROM myTable WHERE `col1` + 0 = `col1`
(l'addition devrait être plus rapide que la multiplication)
Ou la version la plus lente pour continuer à jouer:
SELECT *,
CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC`
FROM `myTable`
HAVING `IS_NUMERIC` = 1
'a' + 0 = 'a'
is TRUE
Je recommande: si votre recherche est simple, vous pouvez utiliser `
column*1 = column
`opérateur intéressant :) est un travail et plus rapide que sur les champs varchar / char
SELECT * FROM maTable WHERE colonne * 1 = colonne;
ABC*1 => 0 (NOT EQU **ABC**)
AB15*A => 15 (NOT EQU **AB15**)
15AB => 15 (NOT EQU **15AB**)
15 => 15 (EQUALS TRUE **15**)
select 'aaa123' >= 0
et select '123aaa' >= 0
retournent tous les deux true?
SELECT * FROM myTable WHERE sign (col1)!=0
bien sûr, le signe (0) est zéro, mais vous pouvez alors limiter votre requête à ...
SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0
MISE À JOUR: Ce n'est pas fiable à 100%, car "1abc" renverrait le signe de 1, mais "ab1c" renverrait zéro ... donc cela ne pourrait fonctionner que pour le texte qui ne commence pas par des nombres.
J'ai trouvé que cela fonctionne assez bien
if(col1/col1= 1,'number',col1) AS myInfo
col1 <> 0
et donne un faux positif pour 1a
- rextester.com/HLORBZ1242
Essayez de diviser / 1
select if(value/1>0 or value=0,'its a number', 'its not a number') from table