Gibt es eine Möglichkeit zu erkennen, ob ein Wert eine Zahl in einer MySQL-Abfrage ist? Sowie
SELECT *
FROM myTable
WHERE isANumber(col1) = true
mysql
sql
where-clause
Urbycoz
quelle
quelle
Antworten:
Dies sollte in den meisten Fällen funktionieren.
Es funktioniert nicht für nicht standardmäßige Zahlen wie
1e4
1.2e5
123.
(nachgestellte Dezimalstelle)quelle
Sie können auch den regulären Ausdruck verwenden ... es wäre wie folgt:
Referenz: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
quelle
WHERE col1 NOT REGEXP...
und für den Fall, dass Sie möglicherweise einen Dezimalpunkt haben, verwenden Sie Regex:^[0-9\.]+$
Wenn Ihre Daten 'test', 'test0', 'test1111', '111test', '111' sind.
So wählen Sie alle Datensätze aus, bei denen die Daten ein einfaches int sind:
Ergebnis: '111'
(In Regex bedeutet ^ Anfang und $ bedeutet Ende)
So wählen Sie alle Datensätze aus, in denen eine Ganzzahl oder eine Dezimalzahl vorhanden ist:
Ergebnis: '111' (wie letztes Beispiel)
Verwenden Sie Folgendes, um alle Datensätze auszuwählen , in denen eine Nummer vorhanden ist:
Ergebnis: 'test0' und 'test1111' und '111test' und '111'
quelle
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
Passt auch zu signierten Dezimalstellen (wie -1,2, +0,2, 6, 2e9, 1,2e-10) ).
Prüfung:
Ergebnis:
Demo
quelle
Gibt numerische Zeilen zurück
Ich habe die Lösung mit folgender Abfrage gefunden und arbeite für mich:
Diese Abfrage gibt Zeilen zurück, deren Spalte nur größer als Null ist
col1
Gibt nicht numerische Zeilen zurück
Wenn Sie die nicht numerische Spalte überprüfen möchten, versuchen Sie dies mit dem Trick (
!col1 > 0
):quelle
SELECT * FROM myTable WHERE col1 = 123;
Abfrage Zeilen zurückgibt, ist sogar der Spaltenwert123abc
Diese Antwort ähnelt Dmitry, lässt jedoch Dezimalstellen sowie positive und negative Zahlen zu.
quelle
Verwenden Sie eine UDF (benutzerdefinierte Funktion).
Dann, wenn Sie abfragen
- gibt 0 zurück
- kehrt zurück 1
Wählen Sie isnumber (mycol) mycol1, col2, colx aus tablex aus. - gibt 1s und 0s für die Spalte mycol1 zurück
- Sie können die Funktion zum Aufnehmen von Dezimalstellen, wissenschaftlichen Notationen usw. verbessern.
Der Vorteil der Verwendung einer UDF besteht darin, dass Sie sie auf der linken oder rechten Seite Ihres "where-Klausel" -Vergleichs verwenden können. Dies vereinfacht Ihr SQL erheblich, bevor es an die Datenbank gesendet wird:
hoffe das hilft.
quelle
Eine andere Alternative, die auf meinem Computer schneller als REGEXP zu sein scheint, ist
Dadurch werden alle Zeilen ausgewählt, in denen col1 mit einem numerischen Wert beginnt.
quelle
AND col1<>0
, um diese Ausnahme zu behandeln.'1a'
. Übrigens: es ist äquivalent zuWHERE col1 <> 0
- rextester.com/DJIS1493Diese einfache Version fehlt noch:
(Addition sollte als Multiplikation schneller sein)
Oder langsamste Version zum weiteren Spielen:
quelle
'a' + 0 = 'a'
ist WAHRIch empfehle: Wenn Ihre Suche einfach ist, können Sie `verwenden
`Operator interessant :) ist Arbeit und schneller als auf Feldern varchar / char
quelle
select 'aaa123' >= 0
als auchselect '123aaa' >= 0
true zurückgegeben werden?Natürlich ist das Vorzeichen (0) Null, aber dann können Sie Ihre Abfrage auf ... beschränken.
quelle
quelle
Ich habe festgestellt, dass dies ganz gut funktioniert
quelle
col1 <> 0
und gibt ein falsches Positiv für1a
- rextester.com/HLORBZ1242Versuchen Sie zu teilen / 1
quelle