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
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
Antworten:
Dies sollte in den meisten Fällen funktionieren.
SELECT * FROM myTable WHERE concat('',col1 * 1) = col1
Es funktioniert nicht für nicht standardmäßige Zahlen wie
1e4
1.2e5
123.
(nachgestellte Dezimalstelle)Sie können auch den regulären Ausdruck verwenden ... es wäre wie folgt:
SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';
Referenz: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
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:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+$';
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:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12
Ergebnis: '111' (wie letztes Beispiel)
Verwenden Sie Folgendes, um alle Datensätze auszuwählen , in denen eine Nummer vorhanden ist:
SELECT *
FROM myTable
WHERE col1 REGEXP '[0-9]+';
Ergebnis: 'test0' und 'test1111' und '111test' und '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]+)?$'
Passt auch zu signierten Dezimalstellen (wie -1,2, +0,2, 6, 2e9, 1,2e-10) ).
Prüfung:
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;
Ergebnis:
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
Gibt numerische Zeilen zurück
Ich habe die Lösung mit folgender Abfrage gefunden und arbeite für mich:
SELECT * FROM myTable WHERE col1 > 0;
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
):
SELECT * FROM myTable WHERE !col1 > 0;
SELECT * FROM myTable WHERE col1 = 123;
Abfrage Zeilen zurückgibt, ist sogar der Spaltenwert123abc
Verwenden Sie eine UDF (benutzerdefinierte Funktion).
CREATE FUNCTION isnumber(inputValue VARCHAR(50))
RETURNS INT
BEGIN
IF (inputValue REGEXP ('^[0-9]+$'))
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
Dann, wenn Sie abfragen
select isnumber('383XXXX')
- gibt 0 zurück
select isnumber('38333434')
- 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:
SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');
hoffe das hilft.
Eine andere Alternative, die auf meinem Computer schneller als REGEXP zu sein scheint, ist
SELECT * FROM myTable WHERE col1*0 != col1;
Dadurch werden alle Zeilen ausgewählt, in denen col1 mit einem numerischen Wert beginnt.
AND col1<>0
, um diese Ausnahme zu behandeln.
'1a'
. Übrigens: es ist äquivalent zu WHERE col1 <> 0
- rextester.com/DJIS1493
Diese einfache Version fehlt noch:
SELECT * FROM myTable WHERE `col1` + 0 = `col1`
(Addition sollte als Multiplikation schneller sein)
Oder langsamste Version zum weiteren Spielen:
SELECT *,
CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC`
FROM `myTable`
HAVING `IS_NUMERIC` = 1
'a' + 0 = 'a'
ist WAHR
Ich empfehle: Wenn Ihre Suche einfach ist, können Sie `verwenden
column*1 = column
`Operator interessant :) ist Arbeit und schneller als auf Feldern varchar / char
SELECT * FROM myTable WHERE Spalte * 1 = Spalte;
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
als auch select '123aaa' >= 0
true zurückgegeben werden?
SELECT * FROM myTable WHERE sign (col1)!=0
Natürlich ist das Vorzeichen (0) Null, aber dann können Sie Ihre Abfrage auf ... beschränken.
SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0
UPDATE: Dies ist nicht 100% zuverlässig, da "1abc" das Vorzeichen 1 zurückgeben würde, "ab1c" jedoch Null zurückgeben würde. Dies könnte also nur für Text funktionieren, der nicht mit Zahlen beginnt.
Ich habe festgestellt, dass dies ganz gut funktioniert
if(col1/col1= 1,'number',col1) AS myInfo
col1 <> 0
und gibt ein falsches Positiv für 1a
- rextester.com/HLORBZ1242
Versuchen Sie zu teilen / 1
select if(value/1>0 or value=0,'its a number', 'its not a number') from table