Ich sehe, dass es in MySQL Cast()
und Convert()
Funktionen gibt, um Ganzzahlen aus Werten zu erstellen, aber gibt es eine Möglichkeit zu überprüfen, ob ein Wert eine Ganzzahl ist? So etwas wie is_int()
in PHP ist das, wonach ich suche.
122
Antworten:
Ich gehe davon aus, dass Sie einen Zeichenfolgenwert überprüfen möchten. Ein guter Weg ist der REGEXP-Operator, der die Zeichenfolge einem regulären Ausdruck zuordnet. Einfach machen
das ist ziemlich schnell. Wenn Ihr Feld numerisch ist, testen Sie einfach auf
stattdessen.
quelle
Ordnen Sie es einem regulären Ausdruck zu.
Siehe http://forums.mysql.com/read.php?60,1907,38488#msg-38488 wie unten angegeben:
quelle
Angenommen, wir haben eine Spalte mit einem alphanumerischen Feld mit Einträgen wie
und Sie möchten den höchsten numerischen Wert aus dieser Datenbankspalte (in diesem Fall 9582), dann hilft Ihnen diese Abfrage
quelle
Hier ist die einfache Lösung dafür, vorausgesetzt, der Datentyp ist varchar
Es wird true zurückgegeben, wenn das Jahr numerisch ist, andernfalls false
quelle
Dies funktioniert auch:
beispielsweise
quelle
SELECT CAST('12a34' AS UNSIGNED)
, was zurückkommt12
?Um zu überprüfen, ob ein Wert in MySQL Int ist, können wir die folgende Abfrage verwenden. Diese Abfrage gibt die Zeilen mit Int-Werten an
quelle
Das Beste, was ich mir von einer Variablen vorstellen kann, ist ein int. Ist eine Kombination mit den Funktionen von MySQL
CAST()
undLENGTH()
.Diese Methode funktioniert für Zeichenfolgen, Ganzzahlen und Datentypen mit Doppel- / Gleitkommazahlen.
Siehe Demo http://sqlfiddle.com/#!9/ff40cd/44
Der wahre Waqas Malik war total beschlagen, um diesen Fall zu testen. Der Patch ist.
Ergebnisse
siehe Demo
quelle
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;
set @val = '1.'; SELECT @val, LENGTH(CAST(@val AS SIGNED)) = IF(CAST(@val AS SIGNED) = 0, CAST(@val AS SIGNED), LENGTH(@val)) AS is_int;
Dieses Refactoring behandelt alle oben genannten Fälle, aber selbst meine Anpassung behandelt nicht -1,0 oder '-1'. Wieder eine super coole Lösung.Wie wäre es mit:
auf numerisch und korrolar testen:
quelle
Ich habe versucht, die oben aufgeführten regulären Ausdrücke zu verwenden, aber sie funktionieren nicht für Folgendes:
Das obige wird return
1
(TRUE
), was bedeutet, dass der Test der Zeichenfolge '12 INCHES 'gegen den obigen regulären Ausdruck zurückgegeben wirdTRUE
. Es sieht aus wie eine Zahl, die auf dem oben verwendeten regulären Ausdruck basiert. In diesem Fall interpretiert der reguläre Ausdruck die 12 als Zahl, da sie am Anfang der Zeichenfolge steht.Im Folgenden wird der richtige Wert (dh
0
) zurückgegeben, da die Zeichenfolge mit Zeichen anstelle von Ziffern beginntDas obige wird
0
(FALSE
) zurückgeben, da der Anfang der Zeichenfolge Text und nicht numerisch ist.Wenn Sie jedoch mit Zeichenfolgen arbeiten, deren Mischung aus Zahlen und Buchstaben mit einer Zahl beginnt, erhalten Sie nicht die gewünschten Ergebnisse. REGEXP interpretiert die Zeichenfolge als gültige Zahl, obwohl dies nicht der Fall ist.
quelle
FALSE
wie erwartet zurückgegeben, da der reguläre Ausdruck mit$
dem Ende der Zeichenfolge endet , sodass nur nach Zahlen gesucht wird, wie vom Autor beabsichtigt.Dies funktioniert gut für VARCHAR, wo es mit einer Zahl beginnt oder nicht.
Möglicherweise gibt es Einschränkungen, wenn Sie zu den größeren NNNNE + - Nummern gelangen
quelle
set @val = '5'; SELECT @val, concat('', @val * 1) != @val is_int;
Für mich funktioniert nur:
von kevinclark geben alle anderen nutzlose sachen für mich zurück, falls
234jk456
oder12 inches
quelle