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
mysql
sql
where-clause
Urbycoz
la source
la source
Réponses:
Cela devrait fonctionner dans la plupart des cas.
Cela ne fonctionne pas pour les nombres non standard comme
1e4
1.2e5
123.
(décimal de fin)la source
Vous pouvez également utiliser l'expression régulière ... ce serait comme:
Référence: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
la source
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:
Résultat: '111'
(Dans regex, ^ signifie début et $ signifie fin)
Pour sélectionner tous les enregistrements contenant un nombre entier ou décimal:
Résultat: '111' (identique au dernier exemple)
Enfin, pour sélectionner tous les enregistrements où le nombre existe, utilisez ceci:
Résultat: 'test0' et 'test1111' et '111test' et '111'
la source
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
Correspondra également aux décimales signées (comme -1,2, +0,2, 6., 2e9, 1,2e-10 ).
Tester:
Résultat:
Démo
la source
Renvoie des lignes numériques
J'ai trouvé la solution avec la requête suivante et fonctionne pour moi:
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
):la source
SELECT * FROM myTable WHERE col1 = 123;
requête retournera des lignes, même la valeur de col est123abc
Cette réponse est similaire à Dmitry, mais elle autorisera les décimales ainsi que les nombres positifs et négatifs.
la source
utiliser une UDF (fonction définie par l'utilisateur).
Puis quand vous interrogez
--retourne 0
- 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:
J'espère que cela t'aides.
la source
Une autre alternative qui semble plus rapide que REGEXP sur mon ordinateur est
Cela sélectionnera toutes les lignes où col1 commence par une valeur numérique.
la source
AND col1<>0
pour gérer cette exception.'1a'
. BTW: c'est équivalent àWHERE col1 <> 0
- rextester.com/DJIS1493Il manque toujours cette version simple:
(l'addition devrait être plus rapide que la multiplication)
Ou la version la plus lente pour continuer à jouer:
la source
'a' + 0 = 'a'
is TRUEJe recommande: si votre recherche est simple, vous pouvez utiliser `
`opérateur intéressant :) est un travail et plus rapide que sur les champs varchar / char
la source
select 'aaa123' >= 0
etselect '123aaa' >= 0
retournent tous les deux true?bien sûr, le signe (0) est zéro, mais vous pouvez alors limiter votre requête à ...
la source
la source
J'ai trouvé que cela fonctionne assez bien
la source
col1 <> 0
et donne un faux positif pour1a
- rextester.com/HLORBZ1242Essayez de diviser / 1
la source